重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Python菱形继承的实例分析

本篇内容介绍了“Python菱形继承的实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

成都创新互联公司专业为企业提供陈巴尔虎网站建设、陈巴尔虎做网站、陈巴尔虎网站设计、陈巴尔虎网站制作等企业网站建设、网页设计与制作、陈巴尔虎企业网站模板建站服务,10年陈巴尔虎做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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

语法

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

菱形继承

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

其中,就会出现菱形继承。如下图所示。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菱形继承的实例分析
URL链接:http://cqcxhl.cn/article/gchghh.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP