文章目录
MRO(method resolution order, 方法解析顺序)是类继承中的一个问题。由于类可能继承多个基类,那么当触发多态时就面临这一个问题:从哪个基类里面去找方法?换句话说,类的遍历(解析)顺序是什么?
当只有一个基类时这个问题很简单,因此一般讨论的是多个基类的解析顺序。
C3
Python3.x采用的是C3算法:如果C继承了N个基类 (B1, B2, …, Bn),那么C的方法解析顺序由下式给出
L[C] = [C] + merge(L[B1], L[B2], …, L(Bn), [B1, B2, …, Bn])
其中merge函数的定义是这样的
H
=L[B1]head
- H是否出现在了其他list的尾部?
- 否:则弹出H,移除其他列表中的H(如有),回到step 1
- 是:假设H出现在T的尾部,则将H 修改为
Thead
,回到step2
- 直到列表为空(成功)或者你不能找到可弹出的元素(失败
TypeError
)