码迷,mamicode.com
首页 > 编程语言 > 详细

mro和c3 算法

时间:2020-07-27 09:25:17      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:方法   结果   表示   类的继承   div   深度优先遍历   部分   比较   元组   

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

 

mro和c3 算法

标签:方法   结果   表示   类的继承   div   深度优先遍历   部分   比较   元组   

原文地址:https://www.cnblogs.com/one-tom/p/13383038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!