• super()干了啥


    super()继承

    转自:https://www.cnblogs.com/silencestorm/p/8404046.html

    class Base(object):
        def __init__(self):
            print("Enter Base")
            print("Leave Base")
    
    class A(Base):
        def __init__(self):
            print('Enter A')
            super(A, self).__init__()  # 等同于python3: super().__init__()
            print('Leave A')
    
    class B(Base):
        def __init__(self):
            print('Enter B')
            super(B, self).__init__()
            print('Leave B')
    
    class C(A,B):
        def __init__(self):
            print('Enter C')
            super(C, self).__init__()
            print('Leave C')
    
    C()
    print(C.mro())
    
    """
    Enter C
    Enter A
    Enter B
    Enter Base
    Leave Base
    Leave B
    Leave A
    Leave C
    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
    """
    

    每一个类,都有一个 MRO(Method Resolution Order) 列表。这是python 搜索属性和方法时的顺序。可以通过 class.mro()obj.__class__.mro() 来查看。

    >>> A.mro()
    [<class '__main__.A'>, <class '__main__.Base'>, <class 'object'>]
    

    super()的原理

    def super(class,instance):
        mro = instance.__class__.mro()
        return mro[mro.index(class)+1]  # 返回的是当前 instance 的 mro 列表中的 class索引+1 的类
    

    所以上面代码执行顺序:

    line 24: 实例化 C 类
    line 21: 执行 C() 实例的 mro 中index=1的类 A
    line 9:  此时 super(A, self).__init__() 中的 self,代表的是 C类实例,所以下一步执行 C实例 mro 中的 类B
    line 15: 此时的 self 还是 C实例,所以根据mro顺序,下一步执行mro中的 Base类
    

  • 相关阅读:
    Ubuntu下RabbitMq 安装与运行
    web_api所需包
    Ubuntu16.04下安装python3.6.4详细步骤
    JavaScript
    css
    html
    MySQL
    day4 函数
    day3 字典,集合,文件
    day2
  • 原文地址:https://www.cnblogs.com/wztshine/p/15118350.html
Copyright © 2020-2023  润新知