Python中的MRO

方法解析顺序(Method Resolution Order - MRO),是一种在多重继承中用于确定方法搜索顺序的算法,又称 C3 超类线性化(superclass linearization)。Python 会计算出每一个类的 MRO 列表。一个类的 MRO 列表是一个包含了其继承链上所有基类的线性顺序列,并且列表中的每一项均保持唯一。当需要在继承链中寻找某个属性时,Python会在 MRO 列表中从左到右开始查找各个基类,直到找到第一个匹配这个属性的类为止。

C3算法

用L(X)表示类X的MRO列表

那么L(X) = [X + L(BASE1) + L(BASE2) + …]

L(BASE)还可以接着展开,一直推到Object没有父类了,L(Object) = [Object]

然后往回带,这里的加表示列表merge操作,这个列表有点像广义表,有head和tail

merge操作:

1.取出第一个表的head,看是否在后面某个表的tail里

2.如果在,则将所在表和第一个表换位置,重复1

3.若不在,输出第一个表的head,并将所有表里含有的这个head元素全部删除

在python里,可以调用类名下的mro属性来输出该类的mro列表