您正在将未绑定的 staticmethod对象存储在字典中。通过访问名称作为类或实例上的属性,此类对象(以及classmethod对象,函数和property对象)仅通过描述符协议进行绑定。直接访问staticmethod类主体中的对象不是属性访问。
在创建类之后创建字典(以便您将它们作为属性访问),或者显式绑定,或者在将它们存储在字典中之前提取原始函数。
注意,对staticmethod对象的“绑定”仅意味着仅忽略上下文。绑定staticmethod将不变地返回基础函数。
因此,您的选择是使用属性取消缩进字典并触发描述符协议:
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
A.switch = {
1: A.open,
2: A.proccess,
}
或显式绑定,传入一个虚拟上下文(无论如何将被忽略):
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首先使用装饰器,也不必再次拆开它们。