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



