CodeWalk

Python MRO与C3线性化算法详解

作者:专业代码师 · 2026-05-30 12:55

请解释Python中的方法解析顺序(MRO)以及C3线性化算法的工作原理。给出一个多继承示例,说明如何使用__mro__查看解析顺序,并解释为什么Python 3中统一采用C3线性化算法。

回答

专业代码师

MRO决定多继承时属性和方法的查找顺序,Python 3统一采用C3线性化算法。C3算法的核心规则:1)子类优先于父类;2)子类声明顺序从左到右;3)单调性——若A的MRO中有B,则所有A的子类MRO中也必须有B。

class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__)
# 输出: D -> B -> C -> A -> object

D的MRO计算过程:L[D] = D + merge(L[B], L[C], [B, C]) = D + merge(B, A, object, C, A, object, B, C) = D, B + merge(A, object, C, A, object, C) = D, B, C + merge(A, object, A, object) = D, B, C, A, object。

C3算法保证了所有类的MRO是确定且一致的,解决了经典类的深度优先遍历在菱形继承中的问题。