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

Python描述符协议调用疑问:super的MRO属性搜索范围

关于super(A, obj).m查找逻辑的疑问解答

你没理解错核心的MRO查找逻辑,官方文档的描述是聚焦在找到第一个匹配项后的处理步骤,而非完整的查找流程:

  1. 实际的super属性查找确实会沿着obj.__class__.__mro__中A之后的所有基类依次遍历,直到找到第一个在自身__dict__中包含m的类B(注意:不会继续查找B的父类,因为是直接读取B.__dict__,而非B的继承链)。
  2. 文档里的描述是当找到这个B之后的处理规则:如果m是描述符,就调用B.__dict__['m'].__get__(obj, A);如果不是描述符,直接返回m本身。

举个实际例子验证:

class Base1:
    def m(self):
        print("Base1.m")

class Base2(Base1):
    pass  # Base2的__dict__中没有m

class Derived(Base2):
    def m(self):
        print("Derived.m")

obj = Derived()
super(Derived, obj).m()  # 输出Base1.m

这里super(Derived, obj).m会先检查Base2的__dict__,找不到m就继续检查Base1的__dict__,找到后执行描述符处理(普通方法是非数据描述符,__get__会绑定obj返回方法对象),最终调用Base1的m方法。

总结:文档的描述是简化了「找到第一个匹配类后的处理逻辑」,而完整流程确实是遍历A之后的所有基类,直到找到第一个包含m的类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:25:08