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获取百度翻译的两种方法示例详解

    Python获取百度翻译的两种方法示例详解

    本文介绍了使用Python通过requests和urllib两种方式获取百度翻译的方法,requests方法通过发送post请求并解析json数据,而urllib方法通过请求和读取url来获取翻译,两种方法各有优劣,用户可根据需求选择
    2024-09-09
  • python数字图像处理之估计噪声参数

    python数字图像处理之估计噪声参数

    这篇文章主要介绍了python数字图像处理之估计噪声参数,图像复原与重建,想了解图像处理的同学,一定要好好看看
    2021-04-04
  • python深度学习tensorflow1.0参数和特征提取

    python深度学习tensorflow1.0参数和特征提取

    这篇文章主要为大家介绍了python深度学习tensorflow1.0参数和特征提取,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 使用python pywin32模块创建windows服务实例探究

    使用python pywin32模块创建windows服务实例探究

    这篇文章主要为大家介绍了使用python pywin32模块创建windows服务实现实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python实现控制台输入密码的方法

    Python实现控制台输入密码的方法

    这篇文章主要介绍了Python实现控制台输入密码的方法,实例对比分析了几种输入密码的方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • Python通用唯一标识符uuid模块使用案例

    Python通用唯一标识符uuid模块使用案例

    这篇文章主要介绍了Python通用唯一标识符uuid模块使用案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 一文了解Python中NotImplementedError的作用

    一文了解Python中NotImplementedError的作用

    NotImplementedError是一个内置异常类,本文主要介绍了一文了解Python中NotImplementedError的作用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 利用tkinter改变下拉列表(Combobox)的选项值

    利用tkinter改变下拉列表(Combobox)的选项值

    这篇文章主要介绍了利用tkinter改变下拉列表(Combobox)的选项值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • python字符串的常用操作方法小结

    python字符串的常用操作方法小结

    这篇文章主要为大家详细介绍了python字符串的常用操作方法,如字符串的替换、删除、截取、复制、连接、比较、查找、分割等,需要的朋友可以参考下
    2016-05-05
  • Django项目中使用JWT的实现代码

    Django项目中使用JWT的实现代码

    这篇文章主要介绍了Django项目中使用JWT的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论