2010-10-14 2 views
14

Учитывая следующий пример класса:Calling STATICMETHOD внутри инициализации контейнеров уровня класса

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

Почему вызов aVariable работает правильно, но с aTuple и aList он возвращает ошибку 'staticmethod' object is not callable?

ответ

16

Это потому, что статический метод является дескриптором. Когда вы присоединяете его к классу и вызываете его с помощью обычного синтаксиса, тогда python вызывает свой метод __get__, который возвращает вызываемый объект. Когда вы рассматриваете его как голый дескриптор, python никогда не вызывает свой метод __get__, и вы в конечном итоге пытаетесь вызвать дескриптор напрямую, который не может быть вызван.

Так что, если вы хотите назвать это, вы должны заполнить детали для себя:

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

Здесь None передается instance параметр (например, на котором дескриптор осуществляется доступ) и Foo передается в параметр owner (класс, на котором находится этот экземпляр дескриптора). Это приводит к возврату фактической вызываемой функции:

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