在类级容器初始化中调用static方法

时间:2010-10-14 12:14:44

标签: python static-methods

给出以下示例类:

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的工作正常,但aTupleaList会回复错误'staticmethod' object is not callable

1 个答案:

答案 0 :(得分: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>