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.同学,你答对了吗?

猜你喜欢

转载自www.cnblogs.com/liu-shi-xiong/p/9033905.html