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__,
}