2011-05-25 43 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