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

Python子类Add的op()方法无法获取父类更新值的问题排查

问题解决:子类正确获取父类更新后的实例属性

问题根源

  1. 子类Add的构造方法中,调用父类构造后执行self.a = a、self.b = b,直接覆盖了父类设置的实例属性值。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:13:24