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

Python继承类输出异常:为何A/B/C均为30?如何实现各值为10/20/30?

问题原因分析
  1. 实例属性共享:创建的C类实例是同一个对象,所有show方法访问的都是这个实例的self.x属性。原代码中B和C的构造方法都没有调用父类的__init__,只有C.__init__将self.x设为30,所以三个show方法输出的都是这同一个值。
  2. 构造方法错误:A.__init__里的self.x没有赋值操作,正确写法应为self.x = x,即便调用这个构造方法也无法完成属性初始化。
实现方案

方案1:使用类属性(推荐,符合类层级默认值需求)

每个类定义独立的类属性x,show方法访问对应类的属性:

class A:
    x = 10
    def show(self):
        print("A:", A.x)

class B(A):
    x = 20
    def show(self):
        super().show()
        print("B:", B.x)

class C(B):
    x = 30
    def show(self):
        super().show()
        print("C:", C.x)

obj = C()
obj.show()

输出结果:

A: 10
B: 20
C: 30

方案2:维护独立实例属性

每个类在构造方法中调用父类构造,并定义专属的实例属性,避免属性覆盖:

class A:
    def __init__(self):
        self.x_a = 10
    def show(self):
        print("A:", self.x_a)

class B(A):
    def __init__(self):
        super().__init__()
        self.x_b = 20
    def show(self):
        super().show()
        print("B:", self.x_b)

class C(B):
    def __init__(self):
        super().__init__()
        self.x_c = 30
    def show(self):
        super().show()
        print("C:", self.x_c)

obj = C()
obj.show()

输出结果同样符合预期。

内容的提问来源于stack exchange,提问作者coded Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:42:48