2016-02-08 74 views
7

我想知道爲什麼此代碼的工作:方法需要明確的`self`說法

class MyClass(object): 
    def f(self): print "Hello" 
    ff = f 
    def g(self): self.ff() 

MyClass().g() 

雖然這並不:因爲它需要一個自變量self.ff[0](self)

class MyClass(object): 
    def f(self): print "Hello" 
    ff = f, 
    def g(self): self.ff[0]() 

MyClass().g() 

TypeError: f() takes exactly 1 argument (0 given) 

是不是self.ff[0] == self.f像以前的情況self.ff == self.f

+0

我不是100%確定,但方法是類的成員的函數。在你的第二個例子中,ff是一個元組,不是函數,ff [0]不是MyClass的成員。這只是一個功能。 –

+0

爲什麼'ff [0]'不是班級的成員? –

+0

這是一個更好的標題嗎?這是一個有趣的問題,謝謝! –

回答

3

打印班級成員時可以看到區別。

對於你的第一個例子中,你會發現功能包裹(未)約束方法,處理self參數爲您提供:

>>> MyClass.ff 
<unbound method MyClass.f> 
>>> MyClass().ff 
<bound method MyClass.f of <__main__.MyClass object at 0x7f53>> 

,而在第二個例子中,函數用作正常功能:

>>> MyClass.ff[0] 
<function f at 0x7f54> 
>>> MyClass().ff[0] 
<function f at 0x7f54> 
+0

讓我們轉移的問題:爲什麼在第二種情況下'MyClass.ff [0]!= MyClass.f' –

+0

@RuggeroTurra出於同樣的原因。 'MyClass.ff [0]'是一個函數,而'MyClass.f'是一個封裝這個函數的未綁定方法。 – tynn