zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    给自己一个书单
    pureMVC学习之一
    泛型与无聊
    队列与DelphiXe新语法
    有道理的前端
    具备 jQuery 经验的人如何学习AngularJS(附:学习路径)
    Blogging with github Pages
    Cookie/Session机制
    通往全栈工程师的捷径 —— react
    女生应该找个有独立博客的男朋友
  • 原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/13550892.html
Copyright © 2011-2022 走看看