zoukankan      html  css  js  c++  java
  • python super原理,不是指父类

    class a(object):
        def __init__(self):
            print('in a')
    class b(a):
        def __init__(self):
            print('in b')
            super().__init__()
            print('out b')
    class c(a):
        def __init__(self):
            print('in c')
            super().__init__()
            print('out c')
    
    class d(b, c):
        def __init__(self):
            print('in d')
            super().__init__()
            print('out d')
    
    a = d()
    print(a.__class__.mro())

    每个对象都有个属性__class__.mro()

    mro是method resolve order的缩写

    代码中是写的super().__init__()

    super()这种写法是super(当前类名,self)的简写

    然后我们直接来看看这段代码执行的结果

    [Running] python "d:pyqt5signal.py"
    in d
    in b
    in c
    in a
    out c
    out b
    out d
    (<class '__main__.d'>, <class '__main__.b'>, <class '__main__.c'>, <class '__main__.a'>, <class 'object'>)

    为啥中间会输出c?

    c并不是b的父类啊

    super其实干的是下面这件事

    def super(cls, inst):
        mro = inst.__class__.mro()
        return mro[mro.index(cls) + 1]

    就是在mro列表中去找下一个类,所以会产生这种输出

  • 相关阅读:
    enum
    高可用复用类
    int 和 Integer 的区别
    MysqlMd5加密
    软件测试例子
    Wordcount
    大气登录页面
    生成二维码的JAVA
    多态的理解
    打印低头思故乡 java
  • 原文地址:https://www.cnblogs.com/junmoxiao/p/8592477.html
Copyright © 2011-2022 走看看