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

Python多继承中obj.a返回2而非4?执行逻辑疑问

为什么D实例的obj.a返回2而不是4?

问题出在你显式调用父类构造函数的顺序,而非继承关系的MRO(方法解析顺序)。

看D类的__init__方法:

def __init__(self):
    C.__init__(self)
    B.__init__(self)
    self.d = 6

你先调用C.__init__(self),此时self.a被设为4,但紧接着又调用了B.__init__(self),而B的构造函数逻辑是:

def __init__(self):
    A.__init__(self)  # 将self.a设为1
    self.a = 2        # 覆盖self.a为2
    self.b = 3

B的构造函数执行时,会先调用A的构造函数给self.a赋值1,随后自己再将self.a改成2——这直接覆盖了之前C构造函数设置的self.a=4,所以最终obj.a的值是2。

需要区分两个关键概念:

  • MRO(方法解析顺序):Python用来查找子类未定义的方法时的搜索顺序,比如若D未定义y(),会优先调用C的y(),再找B的y()。
  • 实例属性的赋值逻辑:实例属性的值由最后一次赋值操作决定,这里你在D的构造函数里先让C给self.a赋值,再让B赋值,后面的操作自然覆盖了前面的结果。

如果想让obj.a取C的4,可以调整D构造函数的调用顺序,把B.__init__(self)放在C.__init__(self)之前,或者修改B的构造函数,避免覆盖self.a的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17