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--面向对象的程序设计之多继承组合应用开发软件规范