Python子类Add的op()方法无法获取父类更新值的问题排查
问题解决:子类正确获取父类更新后的实例属性
问题根源
- 子类
Add的构造方法中,调用父类构造后执行self.a = a、self.b = b,直接覆盖了父类设置的实例属性值。 super().a访问的是父类的类属性(即Parent类中定义的a=0),而非父类构造给实例设置的属性——因为实例的a/b已经被子类覆盖,super()只会去父类的类层级查找属性,不会读取实例上已有的同名属性。
修复方案
如果需要同时保留原始输入值和父类处理后的值,只需给子类的原始值换个属性名存储,避免覆盖父类设置的实例属性:
class Parent: a = 0 b = 0 def __init__(self, a, b): self.a = a + 10 self.b = b + 10 print(f"Arithmetic Operation Start {self.a} + {self.b}") class Add(Parent): def __init__(self, a, b): super().__init__(a, b) # 用下划线前缀的属性存储原始输入,不覆盖父类设置的a、b self._orig_a = a self._orig_b = b print("Now Addition Start") def op(self): # 输出原始输入值 print(f"{self._orig_a} + {self._orig_b} = {self._orig_a + self._orig_b}") # 直接访问self.a、self.b,即为父类处理后的结果 print(f"{self.a} + {self.b} = {self.a + self.b}") s1 = Add(10, 15) s1.op()
运行结果
Arithmetic Operation Start 20 + 25 Now Addition Start 10 + 15 = 25 20 + 25 = 45
原理说明
父类构造方法给实例设置了self.a和self.b,子类没有覆盖这两个属性,而是用_orig_a、_orig_b存储原始输入值,因此直接访问self.a、self.b就能得到父类更新后的结果,无需使用super()。
内容的提问来源于stack exchange,提问作者Sharfuddin Zishan
相关产品推荐
相关产品推荐

