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
相关产品推荐
相关产品推荐

