• 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()
    # 第二个参数可以的到所有的父类的排列顺序
    # 第一个参数是指定开始搜索的父类位置,从该父类的下一个类开始搜索
    
  • 相关阅读:
    代码编译时JDK版本和运行时JDK版本不一致启动项目报错
    Apache 环境变量配置
    Android NDK 环境变量配置
    Android SDK 环境变量配置
    JAVA 环境变量配置
    FFmpeg Download
    JAVA SE Download
    VS 2015 Download
    BASS HOME
    C++11的闭包(lambda、function、bind)
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/8394676.html
Copyright © 2020-2023  润新知