承继是面向工具编程的一个首要的形式,经过承继,子类就能够扩大父类的性能。正在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中都是旧式类。
更多python相干教程,请存眷python教程栏目。
以上就是Python多重承继中的菱形承继的具体内容,更多请存眷资源魔其它相干文章!
标签: Python python教程 python编程 python使用问题 菱形继承 多重继承
抱歉,评论功能暂时关闭!