1、什么是c3算法
在python 2.3 之后 类的继承 区分 新式类继承(继承object) 和经典类继承,python 2.3 及之后 的新式类继承方式,其子类查询父类中的成员顺序 遵循 c3算法 。
2、c3算法查询成员顺序的理解:
假设某一类的继承关系如下
class A: pass class B(A): pass class C(B): pass class D: pass class E(D,C): pass class H: pass class G(H): pass class F(C,G): pass class FOO(E,F): pass
根据C3算法查找FOO继承顺序
FOO =FOO+ E+F
E => C = C+B+A+Object =>E = E,D,C,B+A+Object
F => C = C+B+A+Object G = G+H+Object =>F=F,C,B,A,G,H,Object
FOO = FOO+ E+F =>FOO+(E,D,C,B,A,Object) +(F,C,B,A,G,H,Object ) = FOO,E,D,F,C,B,A,G,H,Object
过程解析:FOO = ((E,D,C,B,A,Object) +(F,C,B,A,G,H,Object )
去第一个元组E 也就是E的继承顺序 ,取元组E的第一个元素E 和 元组F的除去元组F内的第一个元素外的元素匹配,
如果不存在:则将元素E去除,在继续从元组E中取第一个元素D和元组F的除去元组F内的第一个元素外的元素匹配
如果存在:则不移除元素,从第二个元组F中的第一个元素开始匹配 第一个元组E中除去元组E中的第一个元素外的元素进行匹配,不存在:则将第二个元组的第一个元素取出,然后继续从第一个元组的当前第一个元素开始 匹配 以此类推,如果存在,则元素不移除,返回第一组元素 或则下一组元素 的第一个元素开始继续匹配
以此类推
结合以上的顺序 FOO =FOO,E,D,F,C,B,A,G,H,Object
总结:
多继承场景下,每次都是从第一组取第一个值 和后面组除去第一个值后的剩余值匹配,匹配成功 则不移除这个值,匹配不成功则移除这个值,
匹配成功:下一次将从下一组开始取值进行相同的匹配
匹配不成功:下一次还是从这个组中取值进行相同的匹配,