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

