Python ';静态法&x27;对象不可调用

Python ';静态法&x27;对象不可调用,python,Python,我有以下代码: class A(object): @staticmethod def open(): return 123 @staticmethod def proccess(): return 456 switch = { 1: open, 2: proccess, } obj = A.switch[1]() 当我运行此命令时,我不断收到错误: TypeErro

我有以下代码:

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
如何解决它?

您正在字典中存储未绑定的
staticmethod
对象。此类对象(以及
classmethod
对象、函数和
属性
对象)仅通过作为类或实例上的属性访问名称来绑定。直接访问类主体中的
staticmethod
对象不是属性访问

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

注意,
staticmethod
对象的“绑定”仅仅意味着上下文被忽略;绑定的
staticmethod
返回基础函数不变

因此,您的选项是取消字典的登入,并通过使用属性触发描述符协议:

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

A.switch = {
    1: A.open,
    2: A.proccess,   
}
或者显式绑定,传入虚拟上下文(无论如何都会被忽略):

或者使用
\uuuu func\uuu
属性直接访问基础函数:

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

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

但是,如果您所要做的只是为一组函数提供一个名称空间,那么首先就不应该使用类对象。将函数放入模块中。这样一来,您就不必首先使用
staticmethod
装饰程序,也不必再次打开它们。

除了Pieters的答案,您还可以删除
@staticmethod

A类(对象):
def open():
返回123
def PROCESS():
返回456
开关={
1:开放,,
2:过程,
}
obj=A.开关[1]()

但是,通过这种方式,您不能使用
self
调用
open
process
。你可以在任何地方用
A.open()
A.process()
调用它们,也可以只调用
open()
process()
,而不调用
A.
,在类内部调用它们。

可能重复@melpomene:oops,我不知道我为什么会错过它。@melpomene:不完全是重复,你有不同的(更多)带有
staticmethod
对象的选项。@MartijnPieters哦,我没有完全意识到问题标题与正文中的错误消息不匹配。在我看来,结尾的注释是最重要的部分。我们可以从一个模块创建一个我们想要的所有函数的列表,有了这一点,@staticmethod decorator为什么会包含在python中?@Rhdr我认为
@staticmethod
可以使用
self.
self.\uuuu dict\uuuuuu
self.\uu getattribute\uuuuuu
访问静态方法,这与常见的动态方法一致。(我还没有尝试过
\uuu dict\uuu
/
\uuu getattribute\uuuu
,但它们应该可以工作)(请参见
class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

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