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
相关产品推荐
相关产品推荐

