前言:这里就不表述MRO的DFS和BFS了,仅介绍C3算法
说明:C3中的head和tail说明,如列表[a,b,c,d],它的head是a,tail是剩下的部分即b,c,d
以菱形继承为例:求L[A]
class D:
pass
class B(D):
pass
class C(D):
pass
class A(B, C)
pass
L[A] = L[A(B, C)] = [A] + merge(L[B], L[C], [B], [C])
L[B] = L[B(D)] = [B, D]
L[C] = L[C(D)] = [C, D]
以L(B), L(C)代入L(A)即可得到L[A] = [A] + merge([B, D], [C, D], [B], [C]),以下便对merge方法进行详细说明,以求解L[A]为例。
1.对于L[A]中merge里的第一个列表[B, D],判断其第一个元素B是否在剩下这几个列表[C, D], [B], [C]的tail中。明显不在,因为列表[C, D]的head是[C]、tail是[D], 列表[B], [C]的head分别是[B], [C],tail均为空。
2.因为B不在列表[C, D], [B], [C]的tail中,所以将它输出,同时将L[A] = [A] + merge([B, D], [C, D], [B], [C])中merge里的B元素全部删除,即得到L[A] = [A, B] + merge([D], [C, D], [C])。
3.同步骤2中B元素的判断方法一样,对merge中的第一个元素D进行判断,这里对[D]的操作不同于B,因为在L[A] = [A, B] + merge([D], [C, D], [C])中,[D]元素在merge剩下的两个列表[C, D], [C]中[C, D]的的tail里面,所以要对[D], [C, D]进行换序,即L[A] = [A, B] + merge([C, D], [D], [C])。
4.同步骤2中B元素一样,对C元素进行同样的操作后,即得到L[A] = [A, B, C] + merge([D], [D]),而merge([D], [D]) = [D],所以L[A] = [A, B, C, D]
以C3算法最终求得L[A] = [A, B, C, D],即子类A的MRO为A->B->C->D