将方法添加到python中加载的类/模块
问题内容:
如果我有类似的东西
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将执行以下操作:
-
new_method
在物体内寻找obj
。 -
找不到它作为实例属性时,它将尝试在可
obj.__class__
找到函数的类对象(可作为)中查找。 -
现在有些麻烦了,因为Python会注意到它发现的是一个 函数 ,因此会将其“包装”在一个闭包中以创建所谓的“绑定方法”。这是必需的,因为调用
obj.new_method()
时要调用MyClass.new_method(obj)
…换句话说,就是将函数绑定到obj
以创建绑定的方法,这是添加self
参数所需要的。 -
此绑定方法是所返回的
obj.new_method
,然后由于()
该行代码的结尾而最终将调用此方法。
如果对类的搜索也没有成功,那么父类也将按照特定的顺序进行搜索,以找到继承的方法和属性,因此事情会稍微复杂一些。