mro和c3 算法
2021-04-07 19:28
标签:方法 结果 表示 类的继承 div 深度优先遍历 部分 比较 元组 mro案例: 计算方法:先将每一个类的继承mro,先将每个类的mro表示出来 比如我要找H这个类的mro是什么,我先找到每个类的mro后,再进行反向的计算 每个类的mro mro和c3 算法 标签:方法 结果 表示 类的继承 div 深度优先遍历 部分 比较 元组 原文地址:https://www.cnblogs.com/one-tom/p/13383038.htmlMRO:方法解析顺序,其实就是类的多继承时,查看这个类继承了拿个类
C3 算法:就是找到这个类的具体算法
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
例如
‘‘‘
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