You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建对象时递增父类静态counter以实现实例自动编号

问题根因

核心原因是你操作的是实例属性而非父类的静态类属性,触发了Python的属性查找与赋值规则:

  • 执行self.id += 1时分为两步:
    1. 读取值:当前实例没有id属性,向上查找拿到父类Cheese的静态属性值17
    2. 赋值:将计算得到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:00:03