菱形继承问题(菱形继承时,继承的时候要加关键字,防止内存浪费)

网友投稿 832 2022-09-22

菱形继承问题(菱形继承时,继承的时候要加关键字,防止内存浪费)

菱形继承问题(菱形继承时,继承的时候要加关键字,防止内存浪费)

一、类的分类

1.1 新式类

继承了object的类以及该类的子类,都是新式类

python3中所有的类都是新式类

1.2 经典类

没有继承object的类以及该类的子类,都是经典类

只有Python2中才有经典类

二、菱形继承问题

在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D)

如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性

如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

经典类下:深度优先

广度优先:广度优先

经典类:一条路走到黑,深度优先

新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先

三、C3算法与mro()方法介绍

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

子类会先于父类被检查

多个父类会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,选择第一个父类

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:linux/unix Windows mac 下回车换行
下一篇:root的密码忘记了?肿么办呢?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~