Python多重继承中的菱形继承
Python  /  管理员 发布于 7年前   484
本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!
继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。
语法
class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...): pass
推荐学习:Python视频教程
在多层继承和多继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。
其中,就会出现菱形继承。如下图所示。
在这种结构中,在调用顺序上就出现了疑惑,调用顺序究竟是以下哪一种顺序呢
下面我们来解答下这个问题。
举个例子来看下:
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相关教程,请关注python教程栏目。
以上就是Python多重继承中的菱形继承的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号