Python3.x:面向对象的三大特性之继承第二部分

由于多继承是新式类和旧式类区别比较大的地方,所以这里单独写一篇文章来详细介绍

首先来了解一下新式类与旧式类写法上的区别

新式类:
class A(object):

旧式类:
class A:

这里的object相当于一个基类,类的类,没有写要继承的类的话就默认继承这个类,有人可能会说这两种写法没什么区别,其实是有的,在python2中还是有区别的,下面会有提到的地方

那我们是怎么实现多继承的呢?

class A(B, C):

这样,我们就实现了类A继承类B和类C

然后来说一下类的继承顺序


Python3.x:面向对象的三大特性之继承第二部分_第1张图片

这里定义了四个类ABCD,写了四个构造函数,继承关系如下


Python3.x:面向对象的三大特性之继承第二部分_第2张图片
继承关系

A继承B和C,B继承A,C也继承A

这样我们就可以通过pass函数块的方法来探究类的继承顺序

首先pass掉A中的构造函数来看看他会先找B还是先找C:


Python3.x:面向对象的三大特性之继承第二部分_第3张图片

从这里就可以看出他使用了类B中的构造函数,那这个多继承的规律是什么呢?是我们的书写顺序么?我们调换一下B和C的顺序就能知道了:


Python3.x:面向对象的三大特性之继承第二部分_第4张图片

看来,类的继承顺序是按我们的书写顺序来的

接着我们pass掉类B,看看这次会执行哪个类的构造函数


Python3.x:面向对象的三大特性之继承第二部分_第5张图片

看,关键的地方来了,类A我们pass掉了,类B我们也pass掉了,这个时候他并没有去找类B的父类D的构造函数,而是横向又去找了A的父类C的构造函数(红色箭头):


Python3.x:面向对象的三大特性之继承第二部分_第6张图片
继承的查找顺序

接着我们pass掉类C,看看会执行哪个类的构造函数
Python3.x:面向对象的三大特性之继承第二部分_第7张图片

执行了C的父类D的构造函数


Python3.x:面向对象的三大特性之继承第二部分_第8张图片
继承的查找顺序

由此我们可以看出,在类的继承顺序中,是优先横向查找的,横向查找没找到然后纵向查找的,这种就被称为“广度优先”

而在python2中,有不同,但也不是完全相反,就是如果你用的是新式类的写法的话就跟python3一样是“广度优先”,如果你用旧式类的写法class A:则跟python3中的“广度优先”完全相反变为“深度优先”:

Python3.x:面向对象的三大特性之继承第二部分_第9张图片
旧式类继承的查找顺序

这里对深度优先不进行详细探究,请结合广度优先进行理解

综上,自己做了一个表格:


Python3.x:面向对象的三大特性之继承第二部分_第10张图片
总结

希望能帮到你们

P.S:以上的讨论都是在继承的父类最上层是封闭的也就是只有一个的模型下进行的,类似这样的:

Python3.x:面向对象的三大特性之继承第二部分_第11张图片

但是我尝试了如果继承的最上层不是封闭的也就是说最上层不只有一个父类的情况下:
Python3.x:面向对象的三大特性之继承第二部分_第12张图片

即使是python3用的是新式类,依然是深度优先,暂时我也没有查阅到相关资料,希望了解的能够给我提出宝贵的建议和理解

转载请注明出处

python自学技术互助扣扣群:670402334

你可能感兴趣的:(Python3.x:面向对象的三大特性之继承第二部分)