所以我得到了这段代码:
class MyClass:
ACTIONS = {
"ACTION_A": MyClass.__a,
"ACTION_B": MyClass.__b
}
@staticmethod
def do(constant):
ACTIONS[constant]()
@staticmethod
def __a():
print("A")
@staticmethod
def __b():
print("B")
我正在尝试将私有 __ a 和 __ b 函数映射到静态字典,以便我能够使用方法执行
尝试运行此代码时,我会在 ACTIONS 字典的每一行上收到错误:“未解析的引用'MyClass'”。
关于如何使其正常工作的任何想法?
答案 0 :(得分:5)
您不应该首先使用课程。您所做的只是创建命名空间,为此使用模块。在包中创建一个新模块,并将所有功能放在其中:
def _a():
print("A")
def _b():
print("B")
ACTIONS = {
'ACTION_A': _a,
'ACTION_B': _b,
}
def do(constant):
ACTIONS[constant]()
请注意,我使用了单个下划线名称。 Python在类中使用双下划线名称来创建额外的每类命名空间。 MyClass.__a
变为MyClass._MyClass__a
以避免与子类冲突(因此他们可以自由地重用名称而不用担心破坏超类的实现),Python中没有隐私模型。
您可以使用装饰器注册_a
和_b
函数:
def do(constant):
ACTIONS[constant]()
ACTIONS = {}
def action(name):
def decorator(f):
ACTIONS[name] = f
return f
@action('ACTION_A')
def _a():
print("A")
@action('ACTION_B')
def _b()
print("B")
您看到的具体错误是由于在整个MyClass
语句完成之前未设置class
名称。你必须先设置之后的::
class MyClass:
@classmethod
def do(cls, constant):
cls.ACTIONS[constant]()
@staticmethod
def _a():
print("A")
@staticmethod
def _b():
print("B")
MyClass.ACTIONS = {
'ACTION_A': MyClass._a,
'ACTION_B': MyClass._b,
}
请注意,do
是一种类方法,您不能只将ACTIONS
作为全局访问,您需要使用MyClass.ACTIONS
或者,如上所述,使用类方法然后引用cls
上的对象。
您可以通过使用名称来改变ACTIONS
语句之后的class
,并使def do
成为类方法:
class MyClass:
ACTIONS = {
'ACTION_A': '_a',
'ACTION_B': '_b',
}
@classmethod
def do(cls, constant):
getattr(cls, cls.ACTIONS[constant])()
@staticmethod
def _a():
print("A")
@staticmethod
def _b():
print("B")