繁体   English   中英

Python:无法解析的静态变量对类的引用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM