python不支持多重继承,pythonsuper多重继承

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: