在Python中动态添加成员函数到类实例

16 投票
2 回答
9232 浏览
提问于 2025-04-16 18:17

当我执行以下代码时:

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()

撰写回答