Python定义类静态变量报test_object未定义NameError问题求解
错误产生原因
Python执行类定义时,会按从上到下的顺序运行类体内的所有代码,等类体代码全部执行完毕,才会将生成的类对象绑定到test_object这个类名上。定义default_opts属性的阶段,类本身还没创建完成,当前作用域不存在test_object这个标识符,因此触发NameError。
除此之外代码还有一处隐藏问题:即使修复了类定义阶段的报错,foo方法里裸写的default_opts也无法正常访问——类体的临时作用域不会自动嵌套到类的方法内部,方法执行时找不到这个独立的变量名。
类属性(即你提到的类静态变量)确实可以通过类名.属性或self.属性的方式访问,但这个访问逻辑只有在类创建完成后才成立,类定义执行阶段不能提前用未绑定的类名引用属性。
修复方法
- 类体内定义
default_opts时,直接引用同属类体作用域、靠前定义的resolution_default_opts和ee_default_opts即可,无需加test_object.前缀,这两个变量在执行到default_opts赋值行时已经存在于类体临时作用域中。 - 修改
foo方法的取值逻辑,通过self访问类属性,既可以正确拿到配置,也能兼容后续子类继承重写属性的场景。
修复后的可运行代码如下:
class test_object: resolution_default_opts = {'e':{'ylims':[0,2],'xlabel':'resolution'},'t':{'ylog':True,'xlabel':'resolution'}} ee_default_opts = {'eee':{'xlabel':'parameter number'}} # 类体内直接引用前面已定义的变量,不需要加类名前缀 default_opts = {'resolution': resolution_default_opts, 'ee': ee_default_opts} def __init__(self,name): self.name = name def foo(self,input): # 通过self访问类属性 return self.default_opts[input] an_instance = test_object('a_name') print(an_instance.foo('ee'))
运行上述代码会正常输出{'eee': {'xlabel': 'parameter number'}},传入'ee'时返回对应配置的预期逻辑可以正常生效,适配Python 3.8.10版本。
内容的提问来源于stack exchange,提问作者Frostyant
相关产品推荐
相关产品推荐

