在Python中动态添加成员函数到类实例
当我执行以下代码时:
class C:
pass
def f( self ):
print self
a = C()
a.f = f
a.f()
我在 a.f() 这一行遇到了以下错误:
TypeError: f() 需要一个参数(但我没有提供)
问题似乎在于,当 f 被添加到实例 a 时,它被当作一个存储在 a 里的普通函数,而不是一个真正的成员函数。如果我把 a.f() 改成 a.f(a),那么就能得到我想要的效果。但是,有没有办法让 Python 按照我最初的写法来理解呢?换句话说,有没有办法在运行时给一个类的实例添加一个成员函数?
谢谢
2 个回答
5
你应该把 f
放在类里面,而不是放在实例里面...
class C:
pass
def f(self):
print(self)
a = C()
C.f = f
a.f()
对于解释器来说,当对象里没有叫 foo
的东西时, myObject.foo()
和 myClass.foo(myObject)
是一样的。但是,如果一个函数放在对象里,那它就只是一个函数。
26
对于 Python 2.X 版本,你可以使用:
import types
class C:
pass
def f(self):
print self
a = C()
a.f = types.MethodType(f,a)
a.f()
对于 Python 3.X 版本:
import types
class C(object):
pass
def f(self):
print(self)
a = C()
a.f = types.MethodType(f,a)
a.f()