[英]Python: Unresolved reference to class from static variable
所以我得到了这段代码:
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私有函数映射到静态字典,以便能够使用do方法执行函数。
尝试运行此代码时,出现错误:在ACTIONS字典的每一行上出现“ Unresolved reference'MyClass' ”。
关于如何使其正常工作的任何想法?
首先,您不应该使用课程。 您要做的就是创建一个名称空间,为此使用一个模块。 在包中创建一个新模块,并将所有功能放入其中:
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")
您看到的特定错误是由于在整个class
语句完成之前未设置MyClass
名称。 你必须设置该字典算账 :
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
上引用该对象。
您可以通过在class
语句之后设置ACTIONS
来解决,方法是改用名称,然后让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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.