参考:https://www.jianshu.com/p/c9a0b055947b
类C的线性化记忆为L[C]=[C1,C2,...Cn],其中C1称为L[C]的头,其余元素[C2,...Cn]称为尾。如果一个类C继承自基类B1,B2,...,B那么L[C]的计算过程为
#类object为最高父类,所有类都继承object L[objicet]=[object] L[C(B1,B2,...Bn)]=[C]+merge(L[B1],L[B2],[B1,B2,...Bn])
merge是将一组列表输出为一个列表,其过程为
1,检查第一个列表的头元素,记做H 2,如果H是后续序列的第一个元素,或者不在后续序列中再次出现,则将其输出,并将其从所有列表中删除,如果不符合跳过此元素,查找下一个列表的第一个元素,然后回到步骤1 3,重复上述步骤,直至列表为空或者不能再找出可以输出的元素。
举例说明
>>> class A(object): ... pass ... >>> class B(object): ... pass ... >>> class C(A,B): ... pass
首先object,A,B的线性化结果比较简单
L[object]=[object] L[A]=[A,object] L[B]=[B,object]
python内置变量__mro__存储了
>>> object.__mro__ (<class 'object'>,) >>> A.__mro__ (<class '__main__.A'>, <class 'object'>) >>> B.__mro__ (<class '__main__.B'>, <class 'object'>)
需要计算出L[C]
L[C]=[C]+merge(L[A],L[B],[A,B]) =[C]+mergr([A,object],[B,object],[A,B]) #取得的第一个元素是A,是序列[A,B]的第一个元素所以输出A并且将A从所有列表中删除 =[C,A]+merge([object],[B,object],[B]) #取得的元素为object不满足条件,object是序列[B,object]的最后一个元素,跳过取到元素为B,满足条件,将B输出并从所有列表删除B =[C,A,B]+merge([object],[object]) #最后的结果 =[C,A,B,object]
使用__mro__验证计算结果正确
>>> C.__mro__ (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
一个复杂的例子
class B(object): pass class C(object): pass class D(A,C): pass class E(B,C): pass class F(D,E): pass
计算过程
L[F] = [F] + merge(L[D], L[E], [D, E]) = [F] + merge([D, A, C, object], [E, B, C, object], [D, E]) = [F, D] + merge([A, C, object], [E, B, C, object], [E]) = [F, D, A] + merge([C, object], [E, B, C, object], [E]) = [F, D, A, E] + merge([C, object], [B, C, object]) = [F, D, A, E, B] + merge([C, object], [C, object]) = [F, D, A, E, B, C, object]
验证计算结果
(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)