2016-02-08 8 views
7

ich verstehen will, warum dieser Code funktioniert:Methode in Tupel erfordert explizite `self` Argument

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

MyClass().g() 

während dies nicht:

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

MyClass().g() 

, da es ein Argument braucht self.ff[0](self):

Ist nicht self.ff[0] == self.f wie im vorherigen Fall self.ff == self.f?

+0

Ich bin nicht 100% sicher, aber Methoden sind Funktionen, die Mitglieder der Klasse sind. In Ihrem zweiten Beispiel ist ff ein Tupel, keine Funktion und ff [0] ist kein Mitglied von MyClass. Es ist nur eine Funktion. –

+0

Warum 'ff [0]' kein Mitglied der Klasse ist? –

+0

Ist das ein besserer Titel? Es ist eine interessante Frage, danke dafür! –

Antwort

3

Sie können den Unterschied sehen, wenn Sie das Mitglied Ihrer Klasse drucken.

Für Ihr erstes Beispiel werden Sie feststellen, dass die Funktion auf ein (un) gebunden Verfahren eingewickelt wird, die übernimmt die self Parameter für Sie:

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

während in Ihrem zweiten Beispiel die Funktion als ein verwendet wird, normale Funktion:

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

Lassen Sie uns die Frage verschieben: Warum im zweiten Fall 'MyClass.ff [0]! = MyClass.f' –

+0

@RuggeroTurra aus dem gleichen Grund. 'MyClass.ff [0]' ist eine Funktion, während 'MyClass.f' eine ungebundene Methode ist, die diese Funktion umschließt. – tynn

Verwandte Themen