Python多重继承中的菱形继承

本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!
在这里插入图片描述

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )

语法

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
 pass

菱形继承

推荐学习:Python视频教程

在多层继承和多继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。

其中,就会出现菱形继承。如下图所示。

在这里插入图片描述

在这种结构中,在调用顺序上就出现了疑惑,调用顺序究竟是以下哪一种顺序呢

D->B->A->C(深度优先)
D->B->C->A(广度优先)

下面我们来解答下这个问题。

举个例子来看下:

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类分为两种,一种叫经典类,一种叫新式类。都支持多继承,但继承顺序不同。

新式类:从object继承来的类。(如:class A(object)),采用广度优先搜索的方式继承(即先水平搜索,再向上搜索)。
经典类:不从object继承来的类。(如:class A()),采用深度优先搜索的方式继承(即先深入继承树的左侧,再返回,再找右侧)。

Python2.x中类的是有经典类和新式类两种。Python3.x中都是新式类。

相关免费资料分享(点击即可免费观看~)

1、搞懂前后端,一节课上手WEB项目!

http://www.makeru.com.cn/live/5020_2060.html?s=96806

2、一节课搞懂爬虫,爬取海量数据

http://www.makeru.com.cn/live/5020_2061.html?s=96806

3、同样是爬虫,别人为啥用的这么6?

http://www.makeru.com.cn/live/5020_2068.html?s=96806

142244252 学习资料交流群,想要和志同道合的朋友一起学习,大家互相分享自己的学习资料和作品,欢迎感兴趣的朋友共同学习,共同进步,每天还会有免费的公开课程!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值