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

Python中super()实际指向什么?为何输出未指向MRO顺序的下一个类

问题解答

核心原因

你产生误解的核心是混淆了super()的运行时查找逻辑和super对象本身的结构:

  • 你看到的简化版super伪代码,描述的是super对象在查找属性/方法时的逻辑,不是说super()会直接返回MRO序列中下一阶级的实例
  • super本身是Python内置的代理类,调用super()返回的是这个代理类的实例,而非MRO下一个类的实例

打印结果的含义

super对象的默认字符串表示格式固定为<super: <起始查找类>, <绑定的实例>>:

  1. 在happystate的__init__中无参调用super()时,Python会自动填充参数为super(happystate, self),其中:
    • 起始查找类是happystate
    • 绑定的实例是当前happystate的对象
  2. 所以打印super()时自然会输出你看到的结果,这只是代理对象本身的标识,和它实际查找方法的逻辑无关

验证查找逻辑符合预期

你可以通过方法调用验证super确实会查找MRO的下一个类:
修改你的测试代码如下:

class state():
    def __init__(self):
        print("调用了state的__init__")

class event():
    def __init__(self):
        print("调用了event的__init__")

class happystate(state,event):
    def __init__(self):
        print(super())
        super().__init__() # 调用super代理的下一个类的__init__

实例化happystate时会输出:

<super: <class 'happystate'>, <happystate object>>
调用了state的__init__

这就证明了super()虽然打印显示的起始类是happystate,但实际查找方法时确实是从MRO中happystate的下一个类state开始查找,和你看到的定义完全一致。

额外补充

如果手动指定起始查找类,比如调用super(state, self),打印结果会显示起始类为state,此时它查找方法时就会从MRO中state的下一个类event开始查找,调用super(state, self).__init__()就会触发event的__init__执行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:36:04