Python继承类输出异常:为何A/B/C均为30?如何实现各值为10/20/30?
问题原因分析
- 实例属性共享:创建的
C类实例是同一个对象,所有show方法访问的都是这个实例的self.x属性。原代码中B和C的构造方法都没有调用父类的__init__,只有C.__init__将self.x设为30,所以三个show方法输出的都是这同一个值。 - 构造方法错误:
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
相关产品推荐
相关产品推荐

