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

标签 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不可调用?

最佳答案

这是因为静态方法是一个描述符。当您将它附加到一个类并使用通常的语法调用它时,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>

关于python - 在类级容器初始化中调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3932948/

相关文章:

c# - 静态类的静态方法如何知道调用者?

c# - 在父类上调用静态方法时,父类可以推断出子类(C#)的类型吗?

struts2 - Struts 2重构代码以避免OGNL静态方法访问

python - 通过 paramiko 执行长时间运行的命令

python - 方法未定义 - 编译器如何错过它?

python - 使用子进程获取实时输出

javascript - 如何仅使用 python 标准库抓取 javascript 网页

如果互联网连接中断,python + parse.com 上传数据

javascript - 如何在coffeeScript中强制使用 "this"?

static-methods - 将 BLL 类标记为静态还是?