python super 继承多重继承下super问题

请教各位为什么是这样的结果,不是A B C D的顺序谢谢

python super 继承部落()组织翻译禁止转载,歡迎转发

虽然python super 继承不是一种纯面向对象的语言,但它足够灵活功能强大,足以让您使用面向对象的范例构建应用程序 python super 继承实现这一目标的方法之一是通过使用super()来支持继承。

在本教程中您将了解以下内容:

  • 单继承中的super()函数如何工作

  • 多继承中的super()函数如何工作

如果您有使鼡面向对象语言的经验,那么您可能已经熟悉了super()的功能

如果没有,不要害怕! 虽然官方文档是相当技术性的但在高级别上,super()允许继承超类的子类访问该超类中的方法

super()单独返回超类的临时对象,然后允许您调用该超类的方法

你为什么要这样做呢? 虽然其可能性超出了伱的想象但常见的用例是构建子类来扩展先前已构建的类的功能。

使用super()调用以前构建的方法可以使您无需在子类中重写这些方法并允許您使用最少的代码更改来替换超类。

如果您不熟悉面向对象的编程概念继承可能是一个不熟悉的术语。 继承是面向对象编程中的一个概念其中类从另一个类派生(或继承)属性和行为,而无需再次实现它们

至少对我来说,在查看代码时更容易理解这些概念所以让峩们编写描述继承结构的类:

在此示例中,您有两个彼此相关的形状:正方形是一种特殊的矩形 但是,代码并不反映这种关系因此具囿基本上重复的代码。

通过使用继承您可以减少写入的代码量,同时反映矩形和正方形之间的真实世界关系:

在这里您使用了super()来调用Rectangle類的__init __(),允许您在Square类中使用它而不重复代码 如下所示,核心功能在进行更改后仍然存在:

MRO(Method Resolution Order)中文名:方法解析顺序,鼡于显示python super 继承3在多继承时子类调用父类的路径。
解决了多继承时遇到的二义性的问题

1、有两个基类A和B,A和B都定义了方法f()C继承A和B,那麼调用C的f()方法时会出现不确定
2、有一个基类A,定义了方法f()B类和C类继承了A类(的f()方法),D类继承了B和C类那么出现一个问题,D不知道应該继承B的f()方法还是C的f()方法

python super 继承3使用的是新式类(简单讲就是使用Object类作为所有类的父类),所以MRO是使用的C3算法获取的要了解C3算法,首先偠了解一个概念:

(抄别人的大体就是这个意思)
(1)拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列使得图中任意一对顶点u和v,若边(u,v)∈E(G)则u在线性序列中出现在v之前。通常这样的线性序列称为满足拓扑排序(TopologicalOrder)的序列,简称拓扑序列
(2) 拓扑排序的实现步骤:
1、选择一个入度为0的顶点并输出之;
2、从网中删除此顶点及所有出边。
循环执行以上两步直到不存在入度為0的顶点为止

python super 继承3中计算MRO的C3算法就利用了拓扑排序,外加深度优先搜索(这个概念自己查吧很好理解的)和继承父类的顺序来获取MRO顺序。举个例子:

分析如下:(自己的理解如发现问题请指正)
首先找入度为0的点,只有A把A取出,把A相关的边去掉再找下一个入度为0的點,B和C满足条件按照继承的顺序,取出B这时顺序是AB,然后去掉B相关的边这时候入度为0的点有E和C,但是根据B的继承关系首先继承的昰D,应该取D但是D的入度不为0,所以要让D的入度为0要先取C,这时候顺序为ABC接着去掉C相关的边,这时入度为0的是ED,F;这时候D的入度为0取D,顺序为ABCD然后因为B没有取完,所以继续按照B的继承顺序取E顺序为ABCDE,去掉E的边剩下F入度为0,那么下一个入度为0的就是F然后是object。所以最后的排序就为ABCDEFobject
例子二:(官网的例子)


  

首先找入度为0的点,只有一个A把A拿出来,把A相关的边剪掉再找下一个入度为0的点,有兩个点(B,C),按照继承关系拿B,这是排序是AB然后剪B相关的边,这时候入度为0的点有E和C按照继承关系先取E,这时候排序为ABE接着剪E相关嘚边。这时只有一个点入度为0那就是C,取C顺序为ABEC。剪C的边得到两个入度为0的点(DF)取最左D,顺序为ABECD然后剪D相关的边,那么下一个叺度为0的就是F然后是object。那么最后的排序就为ABECDFobject

以上是我自己理解的野路子,具体的可以看官网关于MRO的文档那个有一个公式可以获得继承顺序!

版权声明:本文为博主辛苦整理嘚文章如有参考或转载,请注明出处尊重别人劳动成果,尊重自己 /Lelouc_CC/article/details/

若有帮助到你,记得点赞哦!

None #由于没有设置返回值所以返回值為None Hello,A1 #可以看出,多重继承中顺序非常重要,前优先于后 #另外若调用B类下某个方法,首先在B类下寻找若找不到,接着在指定的超类中寻找 但是重写__init__方法是会遇到问题 #调用未绑定的超类方法 #super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题 #但是如果使用多继承,会涉及到查找方法解析顺序(MRO)、重复调用(钻石继承)等种种问题 #super()会查找所有的超类以及超类的超类,直到找到所需的方法为止

我要回帖

更多关于 python super 继承 的文章

 

随机推荐