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
相关产品推荐
相关产品推荐

