2016-02-08 11 views
7

を必要メソッドは、私は、このコードが動作する理由を理解したい明示的な `self`引数

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

MyClass().g() 

それは引数self.ff[0](self)必要があるので:

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

self.ff[0] == self.fは上記の場合と同じではありませんself.ff == self.f

+0

私は100%確実ではありませんが、メソッドはクラスのメンバーである関数です。 2番目の例では、ffはタプルであり、関数ではなく、ff [0]はMyClassのメンバーではありません。それは単なる関数です。 –

+0

なぜ 'ff [0]'はクラスのメンバーではありませんか? –

+0

それはより良いタイトルですか?面白い質問です、ありがとう! –

答えて

3

あなたのクラスのメンバを印刷するときの違いを見ることができます。

あなたは関数があなたのため selfパラメータを扱う(UN)バインド方法に包まれていることがわかります、あなたの最初の例

:あなたの第二の例では関数は次のように使用されている間

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

質問を移してみましょう:なぜ2番目のケースでは、同じ理由で、なぜMyClass.ff [0]!= MyClass.f' –

+0

@ RuggeroTurraですか? 'MyClass.ff [0]'は関数ですが、 'MyClass.f'はこの関数をラップするアンバウンドメソッドです。 – tynn

関連する問題