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

  • 相关阅读:
    快速排序就这么简单
    Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】
    SpringDataJPA入门就这么简单
    递归就这么简单
    SpringBoot就是这么简单
    Activiti就是这么简单
    Lucene就是这么简单
    过来人告诉你,去工作前最好还是学学Git
    给女朋友讲解什么是Git
    我终于看懂了HBase,太不容易了...
  • 原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/13550892.html
Copyright © 2011-2022 走看看