Python:未解析的静态变量类的引用

时间:2017-05-11 15:22:05

标签: python

所以我得到了这段代码:

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'”。

关于如何使其正常工作的任何想法?

1 个答案:

答案 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")