如何在创建对象时递增父类静态counter以实现实例自动编号
问题根因
核心原因是你操作的是实例属性而非父类的静态类属性,触发了Python的属性查找与赋值规则:
- 执行
self.id += 1时分为两步:- 读取值:当前实例没有
id属性,向上查找拿到父类Cheese的静态属性值17 - 赋值:将计算得到的
18直接绑定到当前实例的id属性上,相当于给每个实例新建了一个独立的同名属性,完全没有修改父类的静态id值
- 读取值:当前实例没有
- 后续新建实例读取到的父类静态
id始终是初始的17,所以所有实例最终的id都是18
修复方案
需要显式修改父类的静态类属性,再将自增后的值赋值给实例:
class Cheese: id = 17 def __init__(self): # 显式修改父类的静态属性 Cheese.id += 1 # 把自增后的值绑定到当前实例 self.id = Cheese.id class Cheddar(Cheese): def __init__(self, name): super().__init__() self.name_ = name def main(): cabot_clothbound = Cheddar("Cabot Clothbound") kerrygold = Cheddar("Kerrygold") tillamook = Cheddar("Tillamook") print(f"Cabot Clothbound: {cabot_clothbound.id}") print(f"Kerrygold: {kerrygold.id}") print(f"Tillamook: {tillamook.id}") main()
运行后输出和你预期一致:
18 19 20
如果希望不同子类有独立的计数器,可以将Cheese.id +=1改为type(self).id +=1,每个子类会继承初始值后单独计数。
内容的提问来源于stack exchange,提问作者kmiklas
相关产品推荐
相关产品推荐

