zoukankan      html  css  js  c++  java
  • python 多重继承 深度优先还是广度优先

    我们常说,python2 是深度优先,python3 是广度优先,
    其实具体来说是 python2.2 及其以前是深度优先 python2.3及其以后就是广度优先了

    python官网
    讲解1
    以及super子类调用父类的讲解
    super详解

    有这样一种需求:
    一个类继承多个父类,同时这些类都有相同的方法名,但是具有不同的方法体,而且,子类需要调用所有父类的该方法

    class Base:
        def vcr(self):
            pass
    
    
    class A(Base):
        def vcr(self):
            print("A")
    
    
    class B(Base):
        def vcr(self):
            print("B")
    
    
    class C(Base):
        def vcr(self):
            print("C")
    
    
    class D(Base):
        def vcr(self):
            print("D")
    
    
    class Z(A, B, C, D):
        def vcr(self):
            super(Z, self).vcr()  # 根据类的多重继承,在A类中就有vcr方法,所以就会停止下来,不在会继续搜索
            super(A, self).vcr()  # 指定搜索的起始位置A,根据下面的列表得到会从A的下一个类开始运行,即B,调用完B的vcr方法之后,就会停下来
            super(B, self).vcr()  # 再次指定其实搜索位置B,从B后面的下一个类开始搜索,即 C,,调用完C的vcr方法之后,就会停下来
            super(C, self).vcr()  # 再次指定其实搜索位置C,从B后面的下一个类开始搜索,即 D,,调用完D的vcr方法之后,就会停下来
            print("Z")
    
    
    z = Z()
    z.vcr()
    # A
    # B
    # C
    # D
    print(Z.mro())  # Z 的搜索路径
    #  [<class '__main__.Z'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.Base'>, <class 'object'>]
    # 可以这么理解:
    # super(Z,self).somemethod()
    # 第二个参数可以的到所有的父类的排列顺序
    # 第一个参数是指定开始搜索的父类位置,从该父类的下一个类开始搜索
    
  • 相关阅读:
    我们是在开发产品还是项目?
    创业期的软件开发管理(一)
    由“I”到“T”
    创业期的软件开发管理(二)
    平台架构用户系统
    产品的臃肿过程
    平台架构——体系结构
    狼群的架构暗示
    如何创建一个好的索引
    哈希索引
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/8394676.html
Copyright © 2011-2022 走看看