2010-10-14 8 views
14

Biorąc pod uwagę następujący przykład klasy:Zadzwoń staticmethod wewnątrz pojemników poziomie klasy inicjalizacji

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]() 

Dlaczego wywołanie aVariable działa poprawnie, ale z aTuple i aList to zwraca błąd 'staticmethod' object is not callable będzie?

Odpowiedz

16

To dlatego, że metoda statyczna jest deskryptorem. Po dołączeniu go do klasy i wywołaniu go za pomocą zwykłej składni, python wywołuje metodę __get__, która zwraca obiekt wywoływalny. Kiedy traktujesz go jak zwykły deskryptor, python nigdy nie wywołuje swojej metody __get__ i na koniec próbuje wywołać bezpośrednio deskryptor, którego nie można wywołać.

Więc jeśli chcesz to nazwać, trzeba podać dane dla siebie:

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

Tutaj None jest przekazywany do instance parametrów (na przykład, na którym deskryptor jest dostęp) i Foo jest przekazywany do parametru owner (klasa, w której znajduje się ta instancja deskryptora). Powoduje to, że zwraca on rzeczywistą funkcję wywoływalną:

>>> Foo.aTuple[0].__get__(None, Foo) 
<function aStaticMethod at 0xb776daac> 
Powiązane problemy