Python多继承中基类调用super()的作用解析
问题原因解析
核心本质是Python的super()并非直接调用父类方法,而是按「方法解析顺序(MRO)」调用继承链中当前类的下一个类的方法,具体拆解如下:
1. 你的代码继承链对应的MRO顺序
假设你的类继承关系是:Square 继承 Rectangle,RightPyramid 同时继承 Square 和 Triangle,那么RightPyramid的MRO(方法调用顺序)是:RightPyramid → Square → Rectangle → Triangle → object
2. 保留super()时的初始化流程
当你实例化RightPyramid并触发初始化时,调用链是这样的:
- 执行
RightPyramid的__init__(若未自定义则继承Square的) - 进入
Square的__init__,其中的super().__init__(**kwargs)会按MRO顺序调用下一个类——Rectangle的__init__ - 进入
Rectangle的__init__,它的super().__init__(**kwargs)继续调用MRO里的下一个类——Triangle的__init__ Triangle的__init__执行,完成height属性的初始化,因此area_2()能正常访问该属性
3. 移除super()后的初始化流程
如果删掉Square里的super()调用:
- 初始化流程在
Square的__init__执行完就直接终止,Rectangle和Triangle的__init__都不会被触发 Triangle没有机会为实例初始化height属性,调用area_2()时自然会抛出AttributeError
关键误区澄清
你可能疑惑RightPyramid明明直接继承了Triangle,为啥要通过Square的super()才能触发它的初始化?这是因为Python多继承严格遵循MRO顺序,Triangle在MRO中排在Square和Rectangle之后,只有前面的类通过super()传递调用链,后面的类方法才会被执行——并非直接按继承关系并行初始化父类。
内容的提问来源于stack exchange,提问作者humanoid
相关产品推荐
相关产品推荐

