• python棱形继承(钻石继承)


    class A(object):
    def func(self): print('A')

    class B(A):
    def func(self):
    super().func()
    print('B')

    class C(A):
    def func(self):
    super().func()
    print('C')

    class D(B,C):
    def func(self):
    super().func()
    print('D')

    b = D()
    b.func()
    print(B.mro())
    #2.7
    # 新式类 继承object类的才是新式类 广度优先
    # 经典类 如果你直接创建一个类在2.7中就是经典类 深度优先
    # print(D.mro())
    # D.mro()

    # 单继承 : 子类有的用子类 子类没有用父类
    # 多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
    # 经典类中 深度优先
    # 新式类中 广度优先
    # python2.7 新式类和经典类共存,新式类要继承object
    # python3 只有新式类,默认继承object
    # 经典类和新式类还有一个区别 mro方法只在新式类中存在
    # super 只在python3中存在
    # super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的

    B和C有共同父类,class D(B,C):先找B再找C最后找A

    super按照棱形继承顺序查找,执行顺序类似多装饰器的套娃执行顺序。

    如果A和E没有共同父类要保证所有类都能执行到,顺序就变为BACE

    A和E有共同父类也要执行B后再执行A,因为如果执行C就不会执行A了(A不是C的父类)。

    总结:

    python3广度优先,但要保证所有的父类都搜索到,所以有的时候也会深度优先,在考虑继承顺序时,只需要考虑到能将所有的类都连起来就对了。

  • 相关阅读:
    IOS-Storyboard全解析-第一部分
    IOS-Socket
    IOS-XMPP
    IOS-源代码管理工具(Git)
    IOS-源代码管理工具(SVN)
    python环境配置
    【移动开发】Android中WIFI开发总结(二)
    【移动开发】Android中WIFI开发总结(一)
    Android 连接Wifi和创建Wifi热点 demo
    Android 判断用户2G/3G/4G移动数据网络
  • 原文地址:https://www.cnblogs.com/daju/p/10222615.html
Copyright © 2020-2023  润新知