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

Python多继承中super()异常解析:传B输出C、传D无输出?

问题原因解析:Python多继承中super的行为逻辑

先还原你的代码场景(方便直观理解):

class B:
    def __init__(self):
        print('B')

class C:
    def __init__(self):
        print('C')

class D:
    def __init__(self):
        print('D')

class A(B, C, D):
    def __init__(self):
        super(B, self).__init__()  # 实际输出'C'而非预期的'B'
        # 若换成 super(D, self).__init__() 则无输出

核心原因是Python的super()并非直接调用指定类的方法,而是基于当前实例的MRO(方法解析顺序),找到锚点类的下一个类来调用方法。

1. 先明确A的MRO

Python多继承的方法查找顺序遵循C3线性化规则,对于class A(B, C, D),它的MRO是:
[A, B, C, D, object]

2. 为什么super(B, self).__init__()输出'C'

super(B, self)的作用是:在self(A实例)的MRO中,找到B的下一个类,然后返回该类的绑定实例。
在A的MRO里,B的下一个类是C,所以实际调用的是C.__init__(),自然输出'C'。
你之前的误区是以为super(B, self)会调用B的方法,但实际上第一个参数是「锚点」,用来定位MRO中的位置,而非指定要调用的类。

3. 为什么super(D, self).__init__()无输出

同样的逻辑,在A的MRO中,D的下一个类是object,而object.__init__()是一个空实现(没有任何输出或操作),所以调用后看不到任何结果。

正确调用B的__init__的方式

如果确实需要调用B的构造方法,有两种可靠方式:

  • 直接显式调用:B.__init__(self)
  • 使用无参数的super()(在A的__init__中,无参数super会自动取MRO中A的下一个类,也就是B):
    class A(B, C, D):
        def __init__(self):
            super().__init__()  # 调用B的__init__,输出'B'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:18:20