2016-02-08 15 views
7

voglio capire il motivo per cui questo codice funziona:Metodo tuple richiede esplicita `self` argomento

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

MyClass().g() 

mentre questo non lo fa:

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

MyClass().g() 

in quanto ha bisogno di un argomento self.ff[0](self):

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

Non è self.ff[0] == self.f come nel caso precedente self.ff == self.f?

+0

Non sono sicuro al 100%, ma i metodi sono funzioni che fanno parte della classe. Nel tuo secondo esempio, ff è una tupla, non una funzione e ff [0] non è un membro di MyClass. È solo una funzione –

+0

perché 'ff [0]' non è un membro della classe? –

+0

E 'un titolo migliore? È una domanda interessante, grazie per questo! –

risposta

3

È possibile vedere la differenza quando si stampa il membro della classe.

Per il vostro primo esempio troverete che la funzione è avvolto ad un (dis) metodo vincolato che gestisce il parametro self per voi:

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

mentre nel secondo esempio la funzione viene usato come funzione normale:

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

spostiamo la domanda: perché nel secondo caso 'MyClass.ff [0]! = MyClass.f' –

+0

@RuggeroTurra per lo stesso motivo. 'MyClass.ff [0]' è una funzione mentre 'MyClass.f' è un metodo non associato che include questa funzione. – tynn

Problemi correlati