zoukankan      html  css  js  c++  java
  • day19 Python MRO详细计算例题

    # 计算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__)
    

      

  • 相关阅读:
    GIthub的小技巧
    C#中DateTime格式转换
    流程控制: if分支 while循环 for循环
    注释,输入,格式化输出,数据类型,运算符
    计算机原理简单了解
    day30
    day19
    day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期
    day17跨文件夹导入模块,模块的两种被执行方式,包,直接使用包中模块,包的管理
    day16模块,导入模板完成的三件事,起别名,模块的分类,模块的加载顺序,环境变量,from...import语法导入,from...import *,链式导入,循环导入
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9974787.html
Copyright © 2011-2022 走看看