MRO:方法解析顺序,其实就是类的多继承时,查看这个类继承了拿个类
C3 算法:就是找到这个类的具体算法
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 G(E): pass class H(G, F): pass
计算方法:先将每一个类的继承mro,先将每个类的mro表示出来
比如我要找H这个类的mro是什么,我先找到每个类的mro后,再进行反向的计算
每个类的mro
例如 ''' L(H) = H + L(G) + L(F) # 这里可以看到,H是继承了G和F的,这里使用深度优先遍历,我先找完L(G) 这边的mro L(G) = G + L(E) L(E) = E + L(C) + L(A) L(C) = C + L(A) L(A)=A # 我再找L(F)这边,也是使用深度优先遍历 L(F)=F + L(D)+ L(E) L(D) = D + L(B) + L(C) L(B) = B + L(A) # 这样我就计算出来每一个类的mro了,为了方便后续计算我将这两个部分按照顺序排序下便于计算 '''
# 排序后
# 排序后 L(H) = H + L(G) + L(F) L(G) = G + L(E) L(F)=F + L(D)+ L(E) L(E) = E + L(C) + L(A) L(D) = D + L(B) + L(C) L(C) = C + L(A) L(B) = B + L(A) L(A)=A # 因此计算的方法可以将L(A)=A 反向代入进行计算, # 把L(A) 往⾥带. 再推回去. 但要记住. 这⾥的 # + 表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元 # 素进⾏比较, 看是否存在. 如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来. # 作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了. L(A)=A L(B) = B + L(A) ----> L(B)=B+A--> L(B)=BA L(C) = C + L(A) ----> L(C)=C+A--> L(C)=CA L(D) = D + L(B) + L(C) ----> L(D)=D+BA+CA ---> L(D)=DBCA L(E) = E + L(C) + L(A) ---->L(E) = E+CA+A ---> L(E)=E, C, A L(F)=F + L(D)+ L(E) ----->L(F)=F, D, B, E, C, A L(G) = G + L(E) ----> L(G)=G, E, C, A L(H) = H + L(G) + L(F) ---->L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) -> H, G, F, D, B, E, C, A