Python多父类中super().__init__触发Base2执行的原理是什么?
Python多重继承中__init__执行顺序解析
先看你的代码示例:
class Base1: def __init__(self): super().__init__() print("Base1 __init__") class Base2: def __init__(self): print("Base2 __init__") class Derived(Base1, Base2): pass # 创建Derived类实例 d = Derived()
执行后输出:
Base2 __init__ Base1 __init__
核心原理:super()与MRO的协作
- 确认MRO顺序:Derived类的方法解析顺序(MRO)是
Derived -> Base1 -> Base2 -> object,你可以通过执行print(Derived.__mro__)直接查看。 - 实例化的调用流程:
- 因为Derived没有自定义
__init__,所以会自动调用MRO中第一个有__init__的类,也就是Base1的__init__。 - Base1的
__init__里调用了super().__init__()——这里的super()不是简单指向Base1的父类(object),而是基于当前实例所属类(Derived)的MRO顺序,找到Base1之后的下一个类,也就是Base2,因此会调用Base2的__init__。 - Base2的
__init__没有调用super(),所以执行完打印语句后,回到Base1的__init__,继续执行后续的打印操作。
- 因为Derived没有自定义
这就是为什么会先输出Base2的信息,再输出Base1的信息,而非只运行Base1的__init__。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

