2010-10-14 11 views
14

Dato il seguente esempio di classe:Calling staticmethod all'interno di contenitori livello di classe di inizializzazione

class Foo: 

    def aStaticMethod(): 
     return "aStaticMethod" 

    aVariable = staticmethod(aStaticMethod) 
    aTuple = (staticmethod(aStaticMethod),) 
    aList = [staticmethod(aStaticMethod)] 

print Foo.aVariable() 
print Foo.aTuple[0]() 
print Foo.aList[0]() 

Perché la chiamata a aVariable funzioni correttamente, ma con la aTuple e aList restituisce l'errore 'staticmethod' object is not callable?

risposta

16

È perché un metodo statico è un descrittore. Quando lo si collega a una classe e lo si chiama con la sintassi usuale, Python chiama il suo metodo __get__ che restituisce un oggetto callable. Quando lo si gestisce come un descrittore nudo, Python non chiama mai il suo metodo __get__ e si finisce per tentare di chiamare direttamente il descrittore che non è richiamabile.

Quindi, se si voglia chiamare, è necessario compilare i dettagli per te:

>>> Foo.aTuple[0].__get__(None, Foo)() 
'aStaticMethod' 

Qui, None viene passato al instance parametro (l'istanza su cui si accede il descrittore) e Foo viene passato al parametro owner (la classe su cui risiede questa istanza del descrittore). Questo fa sì che restituisca una funzione effettiva richiamabile:

>>> Foo.aTuple[0].__get__(None, Foo) 
<function aStaticMethod at 0xb776daac> 
Problemi correlati