线性化用来描述类的继承体系
C3 是水平来看的
分别的按级别表述出每一级类的线性化,然后取第一个级系的第一个类与后面的每个级系的第一个类比较(前面的类不能出现在后面的每个级系中,否则就是一个错误)
,若是同一个类,就从对应的级系的头部拿掉,放在估算的最终类的后面,拿掉的类在最后一个基类级系里
吗?是的话从头在进行上面的拿掉操作,不是的话,在那一个水平上未拿掉过类的级系继续往后比,该拿的拿,
一直到最后一个级系才能从头重新开始。
比如:
O = object
class F(O): pass
class E(O): pass
class D(O): pass
class C(D,F): pass
class B(D,E): pass
class A(B,C): pass
算出A的线性化
L[F] = FO
L[E] = EO
L[D] = DO
L[C] = C + marge(DO, FO, DF) 这个地方D,F代换掉后,还要加上直接的基类
= C + D + marge(O, FO, F)
= C + D + F + marge(O, O)
= CDFO
L[B] = B + marge(DO, EO, DE)
= B + D + marge(O, EO, E)
= B + D + E + marge(O, O)
= BDEO
L[A] = A + marge(BDEO, CDFO, BC)
= A + B + marge(DEO, CDFO, C)
= A + B + C + marge(DEO, DFO)
= A + B + C + D + marge(EO, FO)
= A + B + C + D + E + marge(O, FO)
= A + B + C + D + E + F + marge(O, O)
= ABCDEFO
所以A的线性化或者说继承体系是ABCDEFO
在看一个例子
O = object
class F(O): pass
class E(O): pass
class D(O): pass
class C(D,F): pass
class B(E,D): pass
class A(B,C): pass
L[F] = FO
L[E] = EO
L[D] = DO
L[C] = C + marge(DO, FO, DF)
= C + D + marge(O, FO, F)
= C + D + F + marge(O, O)
= CDFO
L[B] = B + marge(EO, DO, ED)
= B + E + marge(O, DO, D)
= B + E + D + marge(O, O)
= BEDO
L[A] = A + marge(BEDO, CDFO, BC)
= A + B + marge(EDO, CDFO, C)
= A + B + E + marge(DO, CDFO, C)
= A + B + E + C + marge(DO, DFO)
= A + B + E + C + D + marge(O, FO)
= A + B + E + C + D + F + marge(O, O)
= ABECDFO
个人翻译,意思差不多,原文看Michele Simionato这个人的论文