python3 面向对象之多继承

Posted liu-shi-xiong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 面向对象之多继承相关的知识,希望对你有一定的参考价值。

python的多继承还是很有特点的,我本身是从事java方向的,多次见到多继承还是很诧异的,记过一段时间的学习发现的多继承还是有独到之处的,也很有意思.

 1 class A():
 2     def __init__(self):
 3         print("A")
 4 
 5 
 6 class B(A):
 7     def __init__(self):
 8         super().__init__()
 9         print("B")
10 
11 class C(A):
12     def __init__(self):
13         super().__init__()
14         print("C")
15 
16 class D(B, C):
17     def __init__(self):
18         super().__init__()
19         print("D")
20 
21 D()

 

先来个最简单的多继承来测试一下,你觉得它的输出结果会是什么呢?如果有点吃力的话,看下面的继承关系图,给些提示吧.

技术分享图片

 

输出的结果是:ACBD,学过python的同学肯定知道python的多继承特点是从左到右,深度优先.那么就好好体会这个意思吧,再来道题压压惊.

 

 技术分享图片

输出结果是:ACDBE.结合两道题你多少会有些体会,对于图二中的E来说,它的父类有两个B和D,按照关系特点,那么它的继承顺序先B后D,同时调用super()函数,在这里需要用到栈的思想,可以理解为把print()函数依次压入栈中,按照从上至下的顺序分别是DBE,关键的问题就来了,倒是是先调用B类中的super()还是D中的super(),这时你只需要想到栈,你就知道会先调用谁了,没错,就是D类,而D的父类是C类,在初始化D类的同时需要用到父类的方法,那么,就需要将C压入栈中,依次类推,到A类时,A类没有父类,那么,它就可以输出print(),而此时栈中元素从上至下顺序为:ACDBE,这同时也是print()函数调用的顺序.

 

那么再来到相对复杂一点的.

技术分享图片

结果是:ACDBEF.同学,你答对了吗?

以上是关于python3 面向对象之多继承的主要内容,如果未能解决你的问题,请参考以下文章

Python--面向对象的程序设计之多继承组合应用开发软件规范

面向对象之多继承

Python3-2020-测试开发-20- 面向对象之封装,继承,多态

三. python面向对象

Python3 面向对象-类的继承与派生

Python3 与 C# 面向对象之~继承与多态