Python多重继承中的菱形继承-Python教程

资源魔 31 0
本篇文章引见了Python多重承继中,菱形承继的的用法,心愿对学习Python中的冤家有协助!

承继是面向工具编程的一个首要的形式,经过承继,子类就能够扩大父类的性能。正在python中一个类能承继自没有止一个父类,这叫做python的多重承继(Multiple Inheritance )。

语法

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

菱形承继

保举学习:Python视频教程

正在多层承继以及多承继同时应用的状况下,就会呈现复杂的承继关系,多重多承继。

此中,就会呈现菱形承继。以下图所示。mark

正在这类构造中,正在挪用程序上就呈现了纳闷,挪用程序终究是如下哪种程序呢

  • 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使用问题 菱形继承 多重继承

抱歉,评论功能暂时关闭!