- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如果我有类似的东西
import mynewclass
我可以向 mynewclass 添加一些方法吗?概念上类似于以下内容:
def newmethod(self,x):
return x + self.y
mynewclass.newmethod = newmethod
(我正在使用 CPython 2.6)
最佳答案
在 Python 中,import 语句用于模块,而不是类......所以要导入一个类,你需要类似的东西
from mymodule import MyClass
就您的问题而言,答案是肯定的。在 Python 中,类只是常规对象,类方法只是存储在对象属性中的函数。
此外,Python 中对象实例的属性是动态的(您可以在运行时添加新的对象属性),这一事实与前面的事实相结合意味着您可以在运行时向类添加新方法。
class MyClass:
def __init__(self, x):
self.x = x
...
obj = MyClass(42)
def new_method(self):
print "x attribute is", self.x
MyClass.new_method = new_method
obj.new_method()
这是如何工作的?当你打字时
obj.new_method()
Python 将执行以下操作:
在对象 obj
中寻找 new_method
。
如果找不到它作为实例属性,它将尝试在类对象内部查找(可作为 obj.__class__
)找到函数。
现在有一点小技巧,因为 Python 会注意到它找到的是一个函数,因此会将它“包装”在一个闭包中以创建所谓的“绑定(bind)方法” ”。这是必需的,因为当您调用 obj.new_method()
时,您想要调用 MyClass.new_method(obj)
... 换句话说,将函数绑定(bind)到 obj
创建绑定(bind)方法是负责添加 self
参数。
这个绑定(bind)的方法就是obj.new_method
返回的,然后因为那行代码结束的()
所以最终会调用这个.
如果对类的搜索也没有成功,那么父类也将按特定顺序全部搜索以查找继承的方法和属性,因此事情会稍微复杂一些。
关于python - 将方法添加到python中加载的类/模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7749914/
我正在开发一个需要能够平均三个数字的 Facebook 应用程序。但是,它总是返回 0 作为答案。这是我的代码: $y = 100; $n = 250; $m = 300; $number = ($y
我只是无法弄清楚这一点,也找不到任何对我来说有意义的类似问题。我的问题:我从数据库中提取记录,并在我的网页上以每个面板 12 条的倍数显示它们。因此,我需要知道有多少个面板可以使用 JavaScrip
我是一名优秀的程序员,十分优秀!