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

Python子类中super().__init__与super()调用重写方法的行为差异原因求解

问题原因解答

首先你的猜测不成立,该差异是属性赋值先后顺序导致的覆盖问题,全程操作的都是同一个Derived类实例,不存在实例未创建完成、调用父类独立属性的情况。

执行流程拆解

我们按代码执行顺序梳理每一步操作的对象:

  1. 执行d = Derived('Nicky', 20)时,首先进入Derived类的构造方法__init__
  2. 第一步执行super().__init__('abc'):
    • 这里调用父类Base的构造方法,传入的self就是当前正在初始化的Derived实例
    • 父类构造方法中执行self.name = 'abc',给该实例的name属性赋值为abc,随后打印输出Base abc
  3. 父类构造执行完毕,回到Derived的构造方法,执行下一行代码self.name = name:
    • 这里的name参数值为你传入的'Nicky',直接覆盖了实例之前的name属性值,此时实例的name已经变成Nicky
  4. 后续执行d.override()时:
    • 调用super().override()触发父类的override方法,传入的self还是这个已经完成初始化的Derived实例
    • 父类方法读取的是当前实例的name属性,值已经是Nicky,所以打印输出Base-override Nicky

核心逻辑澄清

Python中类的实例属性都存储在实例自身的__dict__字典中,通过super调用父类方法时,方法内部操作的self永远是当前的子类实例,父类方法没有独立的属性存储空间,后执行的赋值操作自然会覆盖之前的赋值结果。

你可以修改Derived的构造方法加打印验证:

class Derived(Base):
    def __init__(self, name, age):
        super().__init__('abc')
        print("父类构造执行完后的name值:", self.name) # 输出abc
        self.name = name
        print("子类赋值后的name值:", self.name) # 输出Nicky
        self.age = age

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:24:01