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

Python多继承下__init__方法的执行行为疑问

让我一步步帮你理清这两种情况的本质原因,核心在于Python的**方法解析顺序(MRO)**和super()的工作逻辑:

1. 未启用super().__init__()的场景

当你创建ChildClass实例时,因为它自身没有定义__init__方法,Python会按照类的MRO(方法解析顺序)去查找父类的__init__。ChildClass的MRO顺序是 [ChildClass, BaseClassA, BaseClassB, object]。

所以第一步会调用BaseClassA的__init__方法,而这个方法里没有调用super(),意味着它不会触发MRO链的后续调用——执行完print('A1')和print('A2')就直接结束了,完全不会去碰BaseClassB的__init__,这就是你只看到A1 A2的原因。

2. 启用super().__init__()的场景

当你给两个父类的__init__都加上super().__init__()后,整个MRO调用链就被打通了,执行流程是这样的:

  • 首先进入BaseClassA的__init__,先打印A1;
  • 执行super().__init__()时,这里的super()不是指向BaseClassA的直接父类object,而是按照ChildClass的MRO顺序,找到BaseClassA之后的下一个类——也就是BaseClassB;
  • 接着调用BaseClassB的__init__,打印B1;
  • 然后执行BaseClassB里的super().__init__(),按照MRO,BaseClassB之后是object,调用object的__init__(这个方法没有任何输出);
  • BaseClassB的__init__执行完剩余代码,打印B2;
  • 回到BaseClassA的__init__,执行剩余代码,打印A2;

整个流程走完,就得到了你看到的A1 B1 B2 A2输出。

这里要重点记住:Python中的super()不是简单指向当前类的父类,而是基于当前实例的MRO顺序,查找下一个应该调用的方法——这是Python多继承体系里非常关键的设计,和很多其他语言的super行为有本质区别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:30:02