Python中super()实际指向什么?为何输出未指向MRO顺序的下一个类
问题解答
核心原因
你产生误解的核心是混淆了super()的运行时查找逻辑和super对象本身的结构:
- 你看到的简化版
super伪代码,描述的是super对象在查找属性/方法时的逻辑,不是说super()会直接返回MRO序列中下一阶级的实例 super本身是Python内置的代理类,调用super()返回的是这个代理类的实例,而非MRO下一个类的实例
打印结果的含义
super对象的默认字符串表示格式固定为<super: <起始查找类>, <绑定的实例>>:
- 在
happystate的__init__中无参调用super()时,Python会自动填充参数为super(happystate, self),其中:- 起始查找类是
happystate - 绑定的实例是当前
happystate的对象
- 起始查找类是
- 所以打印
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
相关产品推荐
相关产品推荐

