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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:37:30