# 计算H的MRO继承顺序
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E(C, A):
pass
class F(D, E):
pass
class M(F, E):
pass
class N:
pass
class P(M, N):
pass
class G(P):
pass
class O:
pass
class X(O):
pass
class H(G, X, F):
pass
"""
# 我们设C3算法是L(x) , 即给出x类. 找到x的MRO
L(H) = H + L(G) + L(X) + L(F) + (GXF)
L(G) = G + L(P) + (P,)
L(X) = X + L(O) + (O,)
L(F) = F + L(D) + L(E) + (DE,)
L(P) = P + L(M) + L(N) + (MN,)
L(O) = O
L(D) = D + L(B) + L(C) + (BC,)
L(E) = E + L(C) + L(A) + (CA,)
L(M) = M + L(F) + L(E) + (FE,)
L(C) = C + L(A) + (A,)
L(B) = B + L(A) + (A,)
L(A) = A
L(N) = N
# 继续替换
L(A) = A
L(B) = B + L(A) + (A,) --> (B,A,)
L(C) = C + L(A) + (A,) --> (C,A,)
L(D) = D + L(B) + L(C) + (B,C,) --> (D,) + (B,A) + (C,A) + (B,C) --> (D,B,C,A,)
L(E) = E + L(C) + L(A) + (C,A,) --> (E,) + (C,A) + (A,) + (C,A) --> (E,C,A,)
L(F) = F + L(D) + L(E) + (D,E,) --> (F,) + (D,B,C,A) + (E,C,A) + (D,E) --> (F,D,B,E,C,A,)
L(M) = M + L(F) + L(E) + (F,E,) --> (M,) + (F,D,B,E,C,A) + (E,C,A) + (F,E) --> (M,F,D,B,E,C,A,)
L(N) = (N,)
L(P) = P + L(M) + L(N) + (M,N,) --> (P,) + (M,F,D,B,E,C,A) + (N,) + (M,N) --> (P,M,F,D,B,E,C,A,N,)
L(X) = X + L(O) + (O,) --> (X,O,)
L(G) = G + L(P) + (P,) --> (G,) + (P,M,F,D,B,E,C,A,N) + (P,) --> (G,P,M,F,D,B,E,C,A,N,)
L(H) = H + L(G) + L(X) + L(F) + (G,X,F) --> (H,) + (G,P,M,F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (G,X,F) --> \
# 这里详细解释步骤
第一步: 判断元组第一项元素和后面所有的元祖除第一项之外的其他项元素做比较,如果此元素不存在,则移除这个元素,加入到MRO表中;如果不存在,则跳过这个元素继续下面步骤二;
第二步: 从下一个元祖的第一项元素和后面每个元祖除第一项之外的元素做比较,如果不存在则重复此步骤;如果存在则将此元素拿出来放到MRO表中,并继续执行步骤三;
第三部: 回到第一个元祖,继续步骤一;
实例: 继续计算上门L(H)的MRO顺序
L(H) = (H,) + (G,P,M,F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (G,X,F)
MRO = []
a). 元祖中第一个元素H,在后面所有元祖中都不存在,因此直接拿出来放到MRO中;
MRO = [H,]
L(H) = (G,P,M,F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (G,X,F)
b). 新的L(H)中 第一个元祖的第一个项 G,在后面的元祖除第一项元素之外的其他元素中,没有找到G元素,因此拿出来放到MRO中,然后移除所有的G,生成新的L(H)
MRO = [H,G]
L(H) = (P,M,F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (X,F)
c). 新的L(H)中 第一个元祖的第一个项 P,在后面的元祖除第一项元素之外的其他元素中,没有找到P元素,因此拿出来放到MRO中,然后移除所有的P,生成新的L(H)
MRO = [H,G,P]
L(H) = (M,F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (X,F)
d). 新的L(H)中 第一个元祖的第一个项 M,在后面的元祖除第一项元素之外的其他元素中,没有找到M元素,因此拿出来放到MRO中,然后移除所有的M,生成新的L(H)
MRO = [H,G,P,M]
L(H) = (F,D,B,E,C,A,N) + (X,O) + (F,D,B,E,C,A) + (X,F)
e). 新的L(H)中 第一个元祖的第一个项 F ,在最后的一个元祖中找到了,那么此时跳过F元素,从第二个元祖(X,O) 的第一个元素X开始和后面的元祖除第一个元素的其他元素做比较;X在其他元祖中没有发现,因此加入到MRO中,移除所有的X,形成新的L(H)
MRO = [H,G,P,M,X]
L(H) = (F,D,B,E,C,A,N) + (O) + (F,D,B,E,C,A) + (F)
f). 回到第一个元祖,拿到第一项元素F,继续和后面比较,重复上面的步骤最终可以拿到最终结果
MRO = [H,G,P,M,X,F,D,B,E,C,A,N,O]
最终得到H的MRO顺序是: H,G,P,M,X,F,D,B,E,C,A,N,O
"""
# 验证结果正确
print(H.__mro__)