您的位置:首页 > 编程语言 > Python开发

python 多重继承 深度优先还是广度优先

2018-01-31 19:51 477 查看
我们常说,
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()
# 第二个参数可以的到所有的父类的排列顺序
# 第一个参数是指定开始搜索的父类位置,从该父类的下一个类开始搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: