线性化用来描述类的继承体系

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这个人的论文

最后修改:2019 年 02 月 23 日
如果觉得我的文章对你有用,请随意赞赏