zoukankan      html  css  js  c++  java
  • 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广度优先,但要保证所有的父类都搜索到,所以有的时候也会深度优先,在考虑继承顺序时,只需要考虑到能将所有的类都连起来就对了。

  • 相关阅读:
    企业级应用框架设计备忘录
    DBHelper
    Oracle客户端精简绿色版 不安装oracle客户端 转载
    回车转TAB
    excel列显示列号 转载
    XtraTreeList Drag Event
    XmlSerializer vs DataContractSerializer: Serialization in Wcf 转载
    转载 在Windows64位环境下.net访问Oracle解决方案
    正则表达式学习笔记
    SQL相关子查询的例子
  • 原文地址:https://www.cnblogs.com/daju/p/10222615.html
Copyright © 2011-2022 走看看