方法解析顺序(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列表