今天小编给大家分享的是关于Python多重继承中的菱形继承介绍,相信很多人都不太了解,为了让大家更加了解Python多重继承中的菱形继承,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。
语法
class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
pass
在多层继承和多继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。
其中,就会出现菱形继承。如下图所示。
在这种结构中,在调用顺序上就出现了疑惑,调用顺序究竟是以下哪一种顺序呢
下面我们来解答下这个问题。
举个例子来看下:
class A():
def __init__(self):
print('init A...')
print('end A...')
class B(A):
def __init__(self):
print('init B...')
A.__init__(self)
print('end B...')
class C(A):
def __init__(self):
print('init C...')
A.__init__(self)
print('end C...')
class D(B, C):
def __init__(self):
print('init D...')
B.__init__(self)
C.__init__(self)
print('end D...')
if __name__ == '__main__':
D()
输出结果
init D...
init B...
init A...
end A...
end B...
init C...
init A...
end A...
end C...
end D...
从输出结果中看,调用顺序为:D->B->A->C->A。可以看到,B、C共同继承于A,A被调用了两次。A没必要重复调用两次。
其实,上面问题的根源都跟MRO有关,MRO(Method Resolution Order)也叫方法解析顺序,主要用于在多重继承时判断调的属性来自于哪个类,其使用了一种叫做C3的算法,其基本思想时在避免同一类被调用多次的前提下,使用广度优先和从左到右的原则去寻找需要的属性和方法。
那么如何避免顶层父类中的某个方法被多次调用呢,此时就需要super()来发挥作用了,super本质上是一个类,内部记录着MRO信息,由于C3算法确保同一个类只会被搜寻一次,这样就避免了顶层父类中的方法被多次执行了,上面代码可以改为:
class A():
def __init__(self):
print('init A...')
print('end A...')
class B(A):
def __init__(self):
print('init B...')
super(B, self).__init__()
print('end B...')
class C(A):
def __init__(self):
print('init C...')
super(C, self).__init__()
print('end C...')
class D(B, C):
def __init__(self):
print('init D...')
super(D, self).__init__()
print('end D...')
if __name__ == '__main__':
D()
输出结果:
init D...
init B...
init C...
init A...
end A...
end C...
end B...
end D...
可以看出,此时的调用顺序是D->B->C->A。即采用是广度优先的遍历方式。
Python类分为两种,一种叫经典类,一种叫新式类。都支持多继承,但继承顺序不同。
Python2.x中类的是有经典类和新式类两种。Python3.x中都是新式类。
关于关于Python多重继承中的菱形继承介绍就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。