python - “staticmethod”对象不可调用

标签 python

我有这个代码:

class A(object):
    @staticmethod
    def open():
        return 123

    @staticmethod
    def proccess():
        return 456

    switch = {
        1: open,
        2: proccess,
    }


obj = A.switch[1]()

当我运行它时,我不断收到错误:

TypeError: 'staticmethod' object is not callable

如何解决?

最佳答案

您将 unbound staticmethod 对象存储在字典中。此类对象(以及 classmethod 对象、函数和 property 对象)仅通过 descriptor protocol 绑定(bind),方法是将名称作为类或实例的属性访问。直接访问类体中的staticmethod对象不是属性访问。

要么在创建类之后创建字典(以便您将它们作为属性访问),要么显式绑定(bind),或者在将它们存储到字典之前提取原始函数。

请注意,staticmethod 对象的“绑定(bind)”仅仅意味着上下文被忽略;绑定(bind)的 staticmethod 返回底层函数不变。

所以您的选择是取消缩进字典并使用属性触发描述符协议(protocol):

class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

A.switch = {
    1: A.open,
    2: A.proccess,   
}

或显式绑定(bind),传入一个虚拟上下文(无论如何都会被忽略):

class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

    switch = {
        1: open.__get__(object),
        2: proccess.__get__(object),   
    }

或直接使用 __func__ 属性访问底层函数:

class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

    switch = {
        1: open.__func__,
        2: proccess.__func__,   
    }

然而,如果你想要做的只是为一堆函数提供一个命名空间,那么你一开始就不应该使用类对象。将函数放在一个模块中。这样你就不必一开始就使用 staticmethod 装饰器,也不必再次打开它们。

关于python - “staticmethod”对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921255/

相关文章:

python - 如何从客户端接收 int 和 string 的缓冲区,并正确存储它们? (cpp 服务器,python 客户端)

python - numpy 数组的形状

python - 如何将文件的输出通过管道传递给 Python 中的变量?

python - 计算每列的统计数据并将其添加到空数据框

python - 在 Fipy 中求解多个偏微分方程

python - 类型错误 : string indices must be integers - while trying to read secret

python - 从 bash 脚本重定向时,比较变量与字符串 python 不起作用

python - python 代码中的 genfromtxt 查找缺失的列

python - graphviz集群的标签多行

python - 最小路径总和中的 UnboundLocalError