Python静态变量互访问题:类内引用类名为何触发NameError?
嘿,这个问题挺常见的,我来给你理清楚~
Python类静态变量的互相访问问题
先回答第一个问题:能在静态变量里访问另一个静态变量吗?
当然可以,但得讲究方式——关键在于类定义的时机:当你在类内部定义静态变量的时候,类本身还没完全创建出来,这时候直接用类名去访问就会踩坑,就像你遇到的情况。
你的报错原因拆解
先看你写的代码:
class Purchase: list_of_items = ["Cake", "Soap", "Jam", "Cereal", "Hand Sanitizer", "Biscuits", "Bread"] list_of_count_of_each_item_sold = [0] * Purchase.list_of_items
报错NameError: name 'Purchase' is not defined,核心原因是:Python是从上到下逐行执行类定义的,当执行到第二行静态变量时,Purchase这个类对象还没被完全创建出来——相当于你还在造房子,就想直接用房子的地址去找东西,肯定找不到啊!
那为什么类方法里用就没问题?因为类方法是在类完全创建好之后才会被调用的,这时候Purchase类已经存在了,不管用Purchase.xxx还是cls.xxx都能正常访问。
对了,顺便提个小细节:你原来的代码里[0] * Purchase.list_of_items本身还有个错误——列表不能和列表相乘,得乘列表的长度len(list_of_items),不然还会触发TypeError,这个也得注意~
解决办法有两种,按需选就行
方法1:直接引用前面的静态变量名
在类定义的作用域里,已经定义好的静态变量可以直接被后续变量引用,就像在函数里用之前定义的变量一样:
class Purchase: list_of_items = ["Cake", "Soap", "Jam", "Cereal", "Hand Sanitizer", "Biscuits", "Bread"] list_of_count_of_each_item_sold = [0] * len(list_of_items) # 直接用list_of_items,再加len取长度
方法2:类定义完成后再赋值
如果遇到更复杂的依赖场景,也可以先给变量一个初始值,等类创建完成后再赋值:
class Purchase: list_of_items = ["Cake", "Soap", "Jam", "Cereal", "Hand Sanitizer", "Biscuits", "Bread"] list_of_count_of_each_item_sold = [] # 类创建好之后,再给这个静态变量赋值 Purchase.list_of_count_of_each_item_sold = [0] * len(Purchase.list_of_items)
最后总结下关键点
- 类定义过程中,静态变量之间直接用变量名引用,别用类名(因为类还没建好)
- 类创建完成后(比如类方法里、类外部),可以放心用类名或者
cls访问静态变量 - 列表相乘要注意:得乘整数(比如列表长度),不能直接乘另一个列表
内容的提问来源于stack exchange,提问作者K J P Singh




