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

Python多继承疑问:为何两段代码中A类__init__调用情况不同?

为什么两段代码中A类的__init__调用情况不同?

先拆解第一段代码的核心问题:

class A:
    def __init__(self,name):
        print('inside a',name)
class B:
    def __init__(self,name):
        print('inside b',name)
class C(B,A):
    def __init__(self,name):
        print('inside c',name)
        super().__init__(name)

你提到的MRO(方法解析顺序)没错,C的MRO确实是[C, B, A, object],但**super()的作用是顺着MRO链调用下一个类的对应方法,前提是当前类的方法必须主动调用super()来延续这个链条**。

在第一段代码里,B类的__init__完全没写super().__init__(name),所以当C通过super().__init__触发B的初始化方法后,B的方法执行完就直接结束了——链条在这里断了,自然不会继续沿着MRO链去调用A的__init__。

再看第二段代码的关键变化:

class D:
    def __init__(self,name):
        print('inside d',name)
class A(D):
    def __init__(self,name):
        print('inside a',name)
        super().__init__(name)
class B(D):
    def __init__(self,name):
        print('inside b',name)
        super().__init__(name)
class C(B,A):
    def __init__(self,name):
        print('inside c',name)
        super().__init__(name)

这里B和A的__init__都添加了super().__init__(name)调用,完美延续了MRO链条:
C的MRO是[C, B, A, D, object],当C调用super().__init__触发B的初始化后,B的方法里通过super()找到MRO链的下一个类A;A的初始化方法再通过super()找到D;D的初始化方法执行完后,因为父类是object(其__init__是空实现),链条才终止。这样整个MRO链上的所有初始化方法都被依次触发,也就出现了你看到的完整输出。

总结两个核心点:

  • super()不是直接调用“父类”方法,而是顺着当前类的MRO链找到下一个类的对应方法
  • 要让MRO链上的所有方法都被执行,每个类的对应方法里都需要主动调用super()来延续链条,否则链条会在某个类处中断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:52:46