python继承,属性查找顺序

以为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算法,今天有点晚了,明天粘上代码

猜你喜欢

转载自www.cnblogs.com/witt-chen/p/12548951.html