gpt4 book ai didi

python - “staticmethod”对象不可调用

转载 作者:IT老高 更新时间:2023-10-28 22:00:34 28 4
gpt4 key购买 nike

我有这个代码:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com