类定义中的NameError

2024-06-01 10:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想定义一个类,如下所示:

class ConfigManager:
    @classmethod
    def load_config(cls):
        # do some complex stuff to load something
        return config

    __CONFIG = ConfigManager.load_config()

    @classmethod
    def get_config(cls):
        return cls.__CONFIG

然后,当我运行以下代码时,它会报告一个NameError

x = ConfigManager.get_config()
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    class ConfigManager:
  File "test.py", line 7, in ConfigManager
    __CONFIG = ConfigManager.load_config()
NameError: name 'ConfigManager' is not defined

为什么会发生这种错误?这是因为Python代码是通过解释执行的,当它转到第7行时,class ConfigManager还没有完成定义吗


Tags: 代码testconfiggetreturn定义defload
1条回答
网友
1楼 · 发布于 2024-06-01 10:25:58

类对象仅在类主体和所有类装饰器被求值之后以其名称存在。这意味着您不能在ConfigManager主体内部使用名称ConfigManager。这包括在类完成之前调用的任何函数或方法

在构建类主体时,可以引用以前在类主体中定义的名称和以前在类主体外部定义的名称

external_name = 'External'

class Demo:
    internal_name = 'Internal'
    print('Body see', external_name, internal_name)
    # throws an error
    print('Body does not see', late_internal_name, late_external_name)
    late_internal_name = 'LateInternal'

late_external_name = 'LateExternal'

这意味着您可以定义一个函数来加载配置,只要它不需要类对象。请注意,即使在类内部定义,在您访问它时,它也不是(类-)方法

class ConfigManager:
    # not a method - does not receive cls/self
    def load_config():
        # do some complex stuff to load something
        return {}

    # call helper as a regular function
    __CONFIG = load_config()
    # clean up helper since it is not a proper method
    del load_config

    @classmethod
    def get_config(cls):
        return cls.__CONFIG

或者,如果需要,您可以延迟加载配置

class ConfigManager:
    _CONFIG = None

    @classmethod
    def _load_config(cls):
        # do some complex stuff to load something
        return {}

    @classmethod
    def get_config(cls):
        if cls._CONFIG is None:
            cls._CONFIG = cls._load_config()
        return cls._CONFIG

相关问题 更多 >