2011-05-25 60 views
12

当我做到以下几点:动态添加成员函数的类的实例在Python

class C: 
pass 

def f(self): 
print self 

a = C() 

a.f = f 

a.f() 

我得到在该行自动对焦()以下错误: 类型错误:F()恰恰1个参数(0给出)

问题似乎是,当f被添加到实例中时,它被看作是存储在一个内部的函数,而不是实际的成员函数。如果我将a.f()更改为a.f(a),那么我会得到预期的效果,但是有没有办法让python以这种方式解释原始示例?换句话说,是否有一种方法可以在运行时将成员函数添加到类的实例中?

感谢

回答

18
import types 
class C: 
    pass 

def f(self): 
    print self 

a = C() 
a.f = types.MethodType(f,a) 
a.f() 
+2

这是将函数添加到特定实例'a' (类'C'的其他实例不具有'f')的方式。 – Dave 2012-07-13 15:33:59

+1

'Cf = types.MethodType(f,None,C)'是将函数添加到类的任何现有或最终新实例的代码C – Julius 2014-03-31 01:24:10

1

你应该把f在类,不在背景...

class C: 
    pass 

def f(self): 
    print(self) 

a = C() 
C.f = f 
a.f() 

对于解释myObject.foo()相同myClass.foo(myObject)当对象不成立任何名为foo的东西,但放置在对象内的函数只是一个函数。

+0

这不起作用 – balki 2012-06-11 19:04:42

+3

这是将函数添加到所有实例的方式类'C'(和它的子类)。 – Dave 2012-07-13 15:34:56