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

作者:西加加先生 时间:2022-08-06 20:29:11 

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在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多重继承之菱形继承的实例详解,希望对大家有所帮助!

来源:https://www.cnblogs.com/ghostlee/p/12298294.html

标签:python,菱形继承,多重继承,继承
0
投稿

猜你喜欢

  • 利用Python实现Excel的文件间的数据匹配功能

    2023-12-04 19:53:42
  • Vue SPA 初次进入加载动画实现代码

    2023-07-02 16:56:25
  • 详细总结Python常见的安全问题

    2022-04-22 14:19:20
  • Go语言中普通函数与方法的区别分析

    2024-02-08 18:02:23
  • python输出第n个默尼森数的实现示例

    2022-08-12 21:07:25
  • Go语言字符串基础示例详解

    2023-07-17 03:14:56
  • 在python 中实现运行多条shell命令

    2023-07-30 10:40:11
  • JQuery的Ajax请求实现局部刷新的简单实例

    2024-05-02 17:05:17
  • Python判断变量是否为Json格式的字符串示例

    2023-11-12 04:48:29
  • mysql 获取规定时间段内的统计数据

    2024-01-24 11:25:10
  • sql字符串函数大全和使用方法示例

    2024-01-26 22:17:48
  • 解决Python3.7.0 SSL低版本导致Pip无法使用问题

    2023-08-22 01:46:55
  • Python检查 云备份进程是否正常运行代码实例

    2023-07-08 23:59:05
  • thinkphp5上传图片及生成缩略图公共方法(分享)

    2024-06-05 15:40:11
  • 网页特效文字之—粗糙字

    2013-07-23 04:34:56
  • 深入浅析Python 命令行模块 Click

    2022-12-13 19:41:40
  • Python爬虫分析微博热搜关键词的实现代码

    2022-11-29 16:13:44
  • MySQL数据库优化经验详谈(服务器普通配置)第1/3页

    2024-01-27 23:30:51
  • python画柱状图--不同颜色并显示数值的方法

    2021-12-31 17:22:18
  • pandas数值排序的实现实例

    2022-05-13 01:36:48
  • asp之家 网络编程 m.aspxhome.com