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

Python父类静态ID变量对子类实例计数翻倍问题如何解决

问题原因
  • 你代码里的Parent().__init__()是错误调用逻辑:Parent()会先实例化一个临时父类对象,这一步已经触发父类__init__执行,计数器+1;之后你又手动调用了这个临时实例的__init__方法,计数器再加1,所以每次实例化子类都会触发两次计数,最终ID翻倍。
  • 删除这句后计数器不递增,是因为子类重写了__init__方法,没有主动调用父类的构造逻辑,父类的计数代码自然不会执行。
  • 额外注意原代码父类__init__的第一个参数写了cls也是错误的:只有类方法的第一个参数才是类对象cls,实例方法的第一个参数是实例本身,约定写为self。
修复方案

直接在子类的__init__里调用super().__init__()即可,不需要手动实例化父类再调用构造,修改后完整代码如下:

#!/usr/bin/python3
class Parent:
    cls_id = 0

    def __init__(self):
        self.cls_inc_id()

    @classmethod
    def cls_inc_id(cls):
        cls.cls_id += 1

    @classmethod
    def child_inc_id(cls):
        cls.id += 1


class Child1(Parent):
    def __init__(self):
        # 正确调用父类构造方法,仅触发一次计数
        super().__init__()
        self.id = super().cls_id
        print("Child1 id: ", self.id)

class Child2(Parent):
    def __init__(self):
        super().__init__()
        self.id = super().cls_id
        print("Child2 id: ", self.id)


child1 = Child1()
child2 = Child1()
child3 = Child2()
child4 = Child2()
运行输出
Child1 id:  1
Child1 id:  2
Child2 id:  3
Child2 id:  4
简化优化方案

如果不需要在子类__init__中做额外初始化,还可以把ID赋值逻辑直接放到父类中,减少重复代码:

class Parent:
    cls_id = 0
    def __init__(self):
        self.cls_inc_id()
        self.id = self.cls_id

    @classmethod
    def cls_inc_id(cls):
        cls.cls_id += 1

class Child1(Parent):
    def __init__(self):
        super().__init__()
        print("Child1 id: ", self.id)

class Child2(Parent):
    def __init__(self):
        super().__init__()
        print("Child2 id: ", self.id)

运行效果和修复后的代码完全一致。

内容的提问来源于stack exchange,提问作者Nagesh Loke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:24:04