Python多重继承之菱形继承的实例详解

 更新时间:2020年02月12日 14:03:18   作者:西加加先生  
继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。这篇文章主要介绍了Python多重继承之菱形继承,需要的朋友可以参考下

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在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自动打开浏览器下载zip并提取内容写入excel

    python自动打开浏览器下载zip并提取内容写入excel

    这篇文章主要给大家介绍了关于python自动打开浏览器下载zip并提取内容写入excel的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现12种降维算法的示例代码

    Python实现12种降维算法的示例代码

    数据降维算法是机器学习算法中的大家族,与分类、回归、聚类等算法不同,它的目标是将向量投影到低维空间,以达到某种目的如可视化,或是做分类。本文将利用Python实现12种降维算法,需要的可以参考一下
    2022-04-04
  • 基于Python实现的微信好友数据分析

    基于Python实现的微信好友数据分析

    这篇文章主要介绍了基于Python实现的微信好友数据分析的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    这篇文章主要介绍了讲解Python的Scrapy爬虫框架使用代理进行采集的方法,并介绍了随机使用预先设好的user-agent来进行爬取的用法,需要的朋友可以参考下
    2016-02-02
  • jupyter notebook读取/导出文件/图片实例

    jupyter notebook读取/导出文件/图片实例

    这篇文章主要介绍了jupyter notebook读取/导出文件/图片实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python实现Selenium自动化Page模式

    Python实现Selenium自动化Page模式

    这篇文章主要介绍了Python实现Selenium自动化Page模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python装饰器中@property属性的使用解析

    python装饰器中@property属性的使用解析

    这篇文章主要介绍了python装饰器中@property属性的使用解析,property属性是一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,需要的朋友可以参考下
    2023-09-09
  • 基于python2.7实现图形密码生成器的实例代码

    基于python2.7实现图形密码生成器的实例代码

    本文通过实例代码给大家介绍了python2.7实现图形密码生成器,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • Python Tensor FLow简单使用方法实例详解

    Python Tensor FLow简单使用方法实例详解

    这篇文章主要介绍了Python Tensor FLow简单使用方法,结合实例形式详细分析了Tensor FLow相关概念、原理、用法与操作注意事项,需要的朋友可以参考下
    2020-01-01
  • Python selenium使用autoIT上传附件过程详解

    Python selenium使用autoIT上传附件过程详解

    这篇文章主要介绍了Python selenium使用autoIT上传附件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论