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),会按如下流程执行:
- 找到MRO中D3的下一个类D2,执行D2的
__init__(1),打印D2 __init__ 1,计算得到self.d2_data = 1 + 2 = 3 - D2的
__init__中自己调用了super().__init__(self.d2_data),这里的super是针对D3实例的MRO链,找D2的下一个类,也就是D1,因此会执行D1的__init__(3),这就是你看到的D1 __init__ 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
相关产品推荐
相关产品推荐

