Python: 多继承模式下 MRO(Method Resolution Order) 的计算方式

大家可能已经知道了,在 Python 3(Python 2 的新式类)中多继承模式是使用 C3 算法来确定 MRO(Method Resolution Order) 的。

那么具体是怎么计算的呢?本文将基于 https://www.python.org/downlo… 中的几个例子来讲解 MRO 是怎么计算的。

我们首先来定义一些符号: :

其中: :

加法运算: :

L[C] 表示类 C 的线性值,其实就是 C 的 MRO, 其中 :

比如有个类 : :

那么: :

merge 的计算规则如下:

take the head of the first list, i.e L[B1][0]; if this head is not in the tail of any of the other lists, then add it to the linearization of C and remove it from the lists in the merge, otherwise look at the head of the next list and take it, if it is a good head. Then repeat the operation until all the class are removed or it is impossible to find good heads. In this case, it is impossible to construct the merge, Python 2.3 will refuse to create the class C and will raise an exception.

计算 MRO

先从简单的类说起: :

简单的子类: :

下面来看一个复杂的例子: :

很容易就可以想到: :

下面来计算 C, B, A:

L[C]: :

L[B]: :

L[A]: :

到这里应该已经有一点眉目了。下面再来个上面那些类的变种,可以先自己算算看,后面有详细的计算过程。

跟之前唯一的区别是 B(D, E) 变成了 B(E, D) :

通过这几个例子应该对如何计算 MRO 已经有所了解了,更详细的信息可以阅读 python MRO 文档 以及 wikipedia 中的 C3 算法.

参考资料

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部