Python描述符协议调用疑问:super的MRO属性搜索范围
关于
super(A, obj).m查找逻辑的疑问解答 你没理解错核心的MRO查找逻辑,官方文档的描述是聚焦在找到第一个匹配项后的处理步骤,而非完整的查找流程:
- 实际的
super属性查找确实会沿着obj.__class__.__mro__中A之后的所有基类依次遍历,直到找到第一个在自身__dict__中包含m的类B(注意:不会继续查找B的父类,因为是直接读取B.__dict__,而非B的继承链)。 - 文档里的描述是当找到这个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
相关产品推荐
相关产品推荐

