在python中将方法添加到已加载的类/模块中

时间:2011-10-13 05:44:25

标签: python

如果我有类似

的话
import mynewclass

我可以在mynewclass中添加一些方法吗?类似于以下概念:

def newmethod(self,x):
    return x + self.y

mynewclass.newmethod = newmethod

(我正在使用CPython 2.6)

2 个答案:

答案 0 :(得分:20)

在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将执行以下操作:

  1. 在对象new_method中查找obj

  2. 没有找到它作为实例属性,它会尝试查看类对象(可以obj.__class__)查找函数。

  3. 现在有一些技巧,因为Python会注意到它发现的是功能,因此会"包裹"它在一个闭包中创建了所谓的"绑定方法"。这是必需的,因为当您调用obj.new_method()时,您想要调用MyClass.new_method(obj) ...换句话说,将函数绑定到obj以创建绑定方法是负责添加{{} 1}}参数。

  4. 此绑定方法是self返回的方法,然后由于该行代码的结尾obj.new_method而最终调用此方法。

  5. 如果对类的搜索也没有成功,那么也会按特定顺序搜索父类以查找继承的方法和属性,因此事情稍微复杂一点。

答案 1 :(得分:5)

是的,如果它是Python类型。除了你在课堂上这样做,而不是模块/包。