在类级别容器初始化中调用静态方法
假设有一个这样的例子类:
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
呢?
1 个回答
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>