我有这个代码:
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/