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

Python多继承初始化输出不符合预期,D1被传入3初始化原因求解

Python多继承下D1 __init__ 3输出的原因解释

这个输出是你在D3构造函数中第一次调用super().__init__(self.d3_data)时触发的,核心和Python的**方法解析顺序(MRO)**以及super的实际工作逻辑有关:

前置前提

你打印的D3实例的MRO顺序已经明确:
D3 → D2 → D1 → Base → object
注意:super不是调用当前类的直接父类,而是在当前实例的MRO链中,找指定类的下一个类来执行方法,和单个类的继承树没有直接关系。

第一次super调用的完整执行流

你在D3的__init__中写的第一行super调用super().__init__(self.d3_data),等价于super(D3, self).__init__(1),会按如下流程执行:

  1. 找到MRO中D3的下一个类D2,执行D2的__init__(1),打印D2 __init__ 1,计算得到self.d2_data = 1 + 2 = 3
  2. D2的__init__中自己调用了super().__init__(self.d2_data),这里的super是针对D3实例的MRO链,找D2的下一个类,也就是D1,因此会执行D1的__init__(3),这就是你看到的D1 __init__ 3的来源
  3. 接下来D1的__init__继续调用super,找到MRO中D1的下一个类Base,执行Base的__init__(3),打印Base __init__ 3

补充说明

你原本预期第一次super只会初始化D2,第二次super才会初始化D1,但忽略了D2、D1的构造函数内部也有super调用,这些调用都会顺着D3实例的MRO链向后传递,而非停在自身的直接父类。你的写法实际上会让D1、Base都被初始化两次,最后Base的b_data被第二次初始化的5覆盖,所以最终调用val()输出的是5。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:54:00