以为python支持多继承,因此在复杂的继承关系下很容易弄错属性的查找顺序,今天特意学习了下
python3用的是c3线性化算法,听名字很高大上,公式我也看了,看不懂,但是这不影响理解查找的顺序
先看下面一张图片:
乍一看好晕
Python类继承父类,在当前类中都是从左往右查找
把顶层O看成第一层,第一层没什么好看的,就一个O类
看第二层C A B D E,可以用如下表达式表示:
L(C) = [C,O] L(A) = [A,O] L(B) = [B,O] L(D) = [D,O] L(E) = [E,O]
第三层:首先看K1,K1继承了C A B
L(K1) = [K1] + merge(L(C),L(A),L(B),(C,A,B)) # 后面的CAB表示继承自CAB
L(K1) = [K1] + merge([C,O],[A,O],[B,O],(C,A,B)) # 首先看这一行表达式,我们先取出L(C)中的第一个元素C,发现L(A),L(B)的尾部(尾部指除第一个元素外后面的元素都是尾部)都没有C这个元素,因此把它取出来放到前面的这个K1列表中
L(K1) = [K1,C] + merge([O],[A,O],[B,O],(C,A,B)) # 然后把L(C)中的C元素删除
L(K1) = [K1,C] + merge([O],[A,O],[B,O],(A,B)) # 然后在对比O元素,发现后面都有,因此看第二个L(A)列表取出第一个A元素,进行对比,发现L(C),L(B)中都没有
L(K1) = [K1,C,A] + merge([O],[O],[B,O],(B)) # 以此类推
L(K1) = [K1,C,A,B] + merge([O],[O],[O])
L(K1) = [K1,C,A,B,O] # 这就是K1类的查找顺序了
L(K3) = [K3,A,D,O]
L(K2) = [K2,B,D,E,O]
L(Z) = [Z] + merge(L(K1),L(K1),L(K1),(K1,K3,K2))
L(Z) = [Z] + merge[K1,C,A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K1,K3,K2)) # 先取K1,发现后面列表尾部并没有,尾部指除第一个元素外后面的元素都是尾部
L(Z) = [Z,K1] + merge[C,A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K3,K2)) # 还是从第一个列表开始,取C进行比较,得下面表达式
L(Z) = [Z,K1,C] + merge([A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K3,K2)) # 取A发现 第二类表尾部有,这时看第二个列表的K3,以此类推
L(Z) = [Z,K1,C,K3,A,K2,B,D,E,O]
这就是C3算法,今天有点晚了,明天粘上代码