zoukankan      html  css  js  c++  java
  • day 20

    多重继承的C3算法

    O==Object

    merge: ① 如果列表空则结束,非空 读merge中第一个列表的表头,
                   ② 查看该表头是否在 merge中所有列表的表尾中。
                   ②-->③ 不在,则 放入 最终的L中,并从merge中的所有列表中删除,然后 回到①中
                   ②-->④ 在,查看 当前列表是否是merge中的最后一个列表
                   ④-->⑤ 不是 ,跳过当前列表,读merge中下一个列表的表头,然后 回到 ②中
                   ④-->⑥ 是,异常。类定义失败。 

    代码:

    class D:
        def func(self):
            pass
    class E:
        def func(self):
            pass
    class F:
        def func(self):
            pass
    class B(D,E):
        def func(self):
            pass
    class C(E,F):
        def func(self):
            pass
    class A(B,C):
        def func(self):
            pass

    print("从A开始查找:")
    for s in A.__mro__:
    print(s)

    
    

    print("从B开始查找:")
    for s in B.__mro__:
    print(s)

    
    

    print("从C开始查找:")
    for s in C.__mro__:
    print(s)

    计算方式:

    mro(A) = mro( A(B,C) )

    原式= [A] + merge( mro(B),mro(C),[B,C] )

    mro(B) = mro( B(D,E) )
    = [B] + merge( mro(D), mro(E), [D,E] ) # 多继承
    = [B] + merge( [D,O] , [E,O] , [D,E] ) # 单继承mro(D(O))=[D,O]
    = [B,D] + merge( [O] , [E,O] , [E] ) # 拿出并删除D
    = [B,D,E] + merge([O] , [O])
    = [B,D,E,O]

    mro(C) = mro( C(E,F) )
    = [C] + merge( mro(E), mro(F), [E,F] )
    = [C] + merge( [E,O] , [F,O] , [E,F] )
    = [C,E] + merge( [O] , [F,O] , [F] ) # 跳过O,拿出并删除
    = [C,E,F] + merge([O] , [O])
    = [C,E,F,O]

    原式= [A] + merge( [B,D,E,O], [C,E,F,O], [B,C])
    = [A,B] + merge( [D,E,O], [C,E,F,O], [C])
    = [A,B,D] + merge( [E,O], [C,E,F,O], [C]) # 跳过E
    = [A,B,D,C] + merge([E,O], [E,F,O])
    = [A,B,D,C,E] + merge([O], [F,O]) # 跳过O
    = [A,B,D,C,E,F] + merge([O], [O])
    = [A,B,D,C,E,F,O]

    结果:

    从A开始查找:
    <class '__main__.A'>
    <class '__main__.B'>
    <class '__main__.D'>
    <class '__main__.C'>
    <class '__main__.E'>
    <class '__main__.F'>
    <class 'object'>
    从B开始查找:
    <class '__main__.B'>
    <class '__main__.D'>
    <class '__main__.E'>
    <class 'object'>
    从C开始查找:
    <class '__main__.C'>
    <class '__main__.E'>
    <class '__main__.F'>
    <class 'object'>

    如何快速判断查找规律?

      • 从 “当前子类” 向上查找它的父类
      • 2. 规律测试

        实例2:对于以下继承

      • 通过如下判断模式:

        代码测试:

        class A1: pass
        class A2: pass
        class A3: pass
        class B1(A1,A2): pass
        class B2(A2): pass
        class B3(A2,A3): pass
        class C1(B1): pass
        class C2(B1,B2): pass
        class C3(B2,B3): pass
        class D(C1, C2, C3): pass

        print("从D开始查找:")
        for s in D.__mro__:
        print(s)

        print("从C3开始查找:")
        for s in C3.__mro__:
        print(s)

      • 测试结果:
      • 从D开始查找:
        <class '__main__.D'>
        <class '__main__.C1'>
        <class '__main__.C2'>
        <class '__main__.B1'>
        <class '__main__.A1'>
        <class '__main__.C3'>
        <class '__main__.B2'>
        <class '__main__.B3'>
        <class '__main__.A2'>
        <class '__main__.A3'>
        <class 'object'>
        从C3开始查找:
        <class '__main__.C3'>
        <class '__main__.B2'>
        <class '__main__.B3'>
        <class '__main__.A2'>
        <class '__main__.A3'>
        <class 'object'>
        
        Process finished with exit code 0
      • --------------------- 
        作者:battlemage22
        来源:CSDN
        原文:https://blog.csdn.net/u011467553/article/details/81437780

  • 相关阅读:
    细数阿里云在使用 Docker 过程中踩过的那些坑
    细数阿里云在使用 Docker 过程中踩过的那些坑
    javascript – 从页面停用浏览器打印选项(页眉,页脚,页边距)?
    jquery children()方法
    jquery 获取输入框的值
    java BigDecimal加减乘除
    window.print()打印时,如何自定义页眉/页脚、页边距
    深入分析:12C ASM Normal冗余中PDB文件块号与AU关系与恢复
    我不是药神,救不了你的穷根
    Install fail! Error: EPERM: operation not permitted
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/10890652.html
Copyright © 2011-2022 走看看