叽叽喳喳,嘻嘻哈哈

导航

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()
# 第二个参数可以的到所有的父类的排列顺序
# 第一个参数是指定开始搜索的父类位置,从该父类的下一个类开始搜索

posted on 2018-01-31 19:51  叽叽喳喳,嘻嘻哈哈  阅读(532)  评论(0编辑  收藏  举报