给出以下示例类:
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
?
答案 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>