Python3-super().__init()__

class A:
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__()

class C(A):
    def __init__(self):
        print("C")
        super().__init__()

class D(B,C):
    def __init__(self):
        print("D")
        super().__init__()

"""
super 是个类
当我们调用 super() 的时候,实际上是实例化了一个 super 类。你没看错, super 是个类,既不是关键字也不是函数等其他数据结构:

super 包含了两个非常重要的信息: 一个 MRO 以及 MRO 中的一个类。

super方法调用的本质是:
    def super(cls, inst):
        mro = inst.__class__.mro()
        return mro[mro.index(cls) + 1]

python3中的新式类mro查看和C3算法原理
两个公式
   L(object) = [object]
   L(子类(父类1, 父类2)) = [子类] + merge(L(父类1), L(父类2) , [父类1, 父类2])
注意
   + 代表合并列表
   merge算法
      1. 第一个列表的第一个元素是后续列表的第一个元素  或者   后续列表中没有再次出现
         则将这个元素合并到最终的解析列表中并从当前操作的所有列表中删除
      2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则
      3. 如果最终无法把所有元素归并到解析列表, 则报错

l[D] = [D] + merge(L(B),L(C),[B,C])
    = [D] + merge([B,A,object],[C,A,object],[B,C])      ①
    = [D,B] + merge([A,object],[C,A,object],[C])        ②
    = [D,B,C] + merge([A,object],[A,object])            ③
    = [D,B,C,A] + merge([object],[object])              ④
    = [D,B,C,A,object]
    
    ①:B 是 第一个列表的第一个元素 并且 是后续列表的第一个元素,所以提出来B,并删除[B,C]里面的 B元素
    ②:A 是 第一个列表的第一个元素 但不是 后续列表的第一个元素,参考上述 merge算法 2,跳过此元素A,查找下一个列表[C,A,object]
    ③:C 是 第一个列表的第一个元素 并且 是后续列表的第一个元素,所以提出来C,并删除[C]里面的 C元素,此时[D,B,C]+merge([A,object],[A,object])
    ④:重复过程①,则最后得到列表[D,B,C,A,object]
     
"""

D()
print(D.mro())

结果显示:

D
B
C
A
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

 

参考:https://www.cnblogs.com/Jesee/p/10862424.htmlhttps://www.cnblogs.com/chen55555/p/10274310.html

posted @ 2020-08-23 21:43  闹点小情绪q  阅读(211)  评论(0编辑  收藏  举报