在类级别容器初始化中调用静态方法

14 投票
1 回答
2105 浏览
提问于 2025-04-16 05:29

假设有一个这样的例子类:

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 个回答

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>

撰写回答