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

Python3重新定义父类后子类super仍调用旧类是什么原因?

重定义a类后super()仍调用旧构造方法的原因

  • Python的类继承关系在子类定义时就完成了静态绑定:运行class b(a)这行代码时,Python会把当前a变量指向的旧类作为b的父类,写入b的__bases__属性和方法解析顺序(MRO)列表中,和后续a变量的指向变化无关。
  • super().__init__()的查找逻辑完全基于子类的MRO列表,你后续重新定义class a本质上只是把全局变量a的指向修改为新的类对象,已经完成定义的b类的MRO、父类引用不会同步更新,所以super()始终查找的是最开始绑定的旧a类的构造方法。

你可以打印b.__bases__[0]验证:重定义a类后,b.__bases__[0]仍然输出最初定义的旧a类,和当前全局的a不是同一个对象。

改为a.__init__(self)后调用新构造方法的原因

这种写法没有依赖子类预先绑定的父类引用,每次执行时都会动态查找当前全局作用域下a变量指向的类对象,你后续已经把a的指向改成了新定义的类,所以这时候调用的自然就是新a类的构造方法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:36:05