2010-10-14 13 views
14

Dada la siguiente clase de ejemplo:Calling métodoestático dentro de contenedores nivel de clase de inicialización

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

¿por qué el llamado a aVariable funciona correctamente pero con la aTuple y aList se devuelve el error 'staticmethod' object is not callable?

Respuesta

16

Es porque un método estático es un descriptor. Cuando lo adjunta a una clase y lo llama con la sintaxis habitual, entonces python llama a su método __get__ que devuelve un objeto invocable. Cuando tratas con él como un simple descriptor, python nunca llama a su método __get__ y terminas tratando de llamar directamente al descriptor que no se puede llamar.

Así que si quieres llamarlo, usted tiene que rellenar los datos por sí mismo:

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

Aquí, None se pasa a la instance parámetro (la instancia en la que se está accediendo al descriptor) y Foo se pasa al parámetro owner (la clase en la que reside esta instancia del descriptor). Esto hace que devuelva una función real invocable:

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