python不支持多重继承,pythonsuper多重继承
本文介绍了钻石继承在Python多重继承中的用法,希望对学习Python的朋友有所帮助!
继承是面向对象编程的一种重要方式。通过继承,子类可以扩展父类的功能。在python中,一个类可以从多个父类继承,这被称为python的多重继承。
语法
class SubclassName(基本类1,基本类2,基本类3,):
Pass
菱形继承
推荐学习:Python视频教程多层继承和多重继承同时使用时,会出现复杂的继承关系,多重继承和多重继承。
其中会出现钻石传承。如下图所示。
在这个结构中,调用序列存在疑问。以下哪个是调用序列?
D-B-A-C(深度优先)D-B-C-A(广度优先)让我们来回答这个问题。
举个例子:
A类():
def __init__(self):
打印(初始化A . )
打印(结束A . )
B(A)类:
def __init__(self):
打印(初始B . )
A.__init__(self)
打印(结束B . )
丙类(甲):
def __init__(self):
打印(初始化C . )
A.__init__(self)
打印(结束C . )
D类(B,C):
def __init__(self):
打印(初始数据.)
B.__init__(self)
C.__init__(self)
打印(结束D . )
if __name__==__main__:
d()输出结果
初始D.
初始化B.
初始A.
结束A.
结束B.
初始化C.
初始A.
结束A.
结束C.
目标.从输出结果来看,调用顺序是:D-B-A-C-A,可以看到,B和C一起从A继承,A被调用两次。a没必要叫两次。
事实上,上述问题的根源都与MRO有关。MRO(Method Resolution Order),又称方法解析顺序,主要用于判断多重遗传中声调的属性来自哪一类。它使用一种叫做C3,的算法,其基本思想是在避免同一类被调用多次的前提下,使用广度优先和从左到右的原则去寻找需要的属性和方法。.
那么如何避免顶级父类中的某个方法被多次调用呢?这时候就需要super()来发挥作用了。超级本质上是一个类,MRO信息是内部记录的。由于C3算法保证了同一个类只被搜索一次,它避免了在顶级父类中的方法被多次执行。上面的代码可以改为:
A类():
def __init__(self):
打印(初始化A . )
打印(结束A . )
B(A)类:
def __init__(self):
打印(初始B . )
超级(B,自我)。__init__()
打印(结束B . )
丙类(甲):
def __init__(self):
打印(初始化C . )
超级(C,自我)。__init__()
打印(结束C . )
D类(B,C):
def __init__(self):
打印(初始数据.)
超级(D,自我)。__init__()
打印(结束D . )
if __name__==__main__:
d()输出结果:
初始D.
初始化B.
初始化C.
初始A.
结束A.
结束C.
结束B.
目标.可以看到,此时的调用顺序是D-B-C-A,也就是采用了广度优先的遍历方法。
补充内容
Python类分为两种,一种是经典类,一种是新式类.两种都支持多重继承,只是继承顺序不同。从对象继承的新式类:类。(如:class A(object)),由广度优先搜索继承(即先横向搜索,后向上搜索)。经典类:是一个不从object继承的类。(比如A类()),用深度优先搜索继承(也就是先深入到继承树的左侧,再往回找右侧)。Python2.x中有两种类:经典类和新类。Python3.x中都是新式类。
更多python相关教程,请关注python教程部分。以上是Python多重继承中钻石继承的细节。其他相关文章请多关注盛行的IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。