You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动