最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python多重继承中的菱形继承

来源:懂视网 责编:小采 时间:2020-11-03 18:18:40
文档

Python多重继承中的菱形继承

Python多重继承中的菱形继承:本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inh
推荐度:
导读Python多重继承中的菱形继承:本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inh
本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!

继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。

语法

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
 pass

菱形继承

推荐学习:Python视频教程

在多层继承和多继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。

其中,就会出现菱形继承。如下图所示。mark

在这种结构中,在调用顺序上就出现了疑惑,调用顺序究竟是以下哪一种顺序呢

  • D->B->A->C(深度优先)
  • D->B->C->A(广度优先)
  • 下面我们来解答下这个问题。

    举个例子来看下:

    class A():
     def __init__(self):
     print('init A...')
     print('end A...')
    
    class B(A):
     def __init__(self):
     print('init B...')
     A.__init__(self)
     print('end B...')
    
    class C(A):
     def __init__(self):
     print('init C...')
     A.__init__(self)
     print('end C...')
    
    class D(B, C):
     def __init__(self):
     print('init D...')
     B.__init__(self)
     C.__init__(self)
     print('end D...')
    
    if __name__ == '__main__':
     D()

    输出结果

    init D...
    init B...
    init A...
    end A...
    end B...
    init C...
    init A...
    end A...
    end C...
    end D...

    从输出结果中看,调用顺序为:D->B->A->C->A。可以看到,B、C共同继承于A,A被调用了两次。A没必要重复调用两次。

    其实,上面问题的根源都跟MRO有关,MRO(Method Resolution Order)也叫方法解析顺序,主要用于在多重继承时判断调的属性来自于哪个类,其使用了一种叫做C3的算法,其基本思想时在避免同一类被调用多次的前提下,使用广度优先和从左到右的原则去寻找需要的属性和方法。

    那么如何避免顶层父类中的某个方法被多次调用呢,此时就需要super()来发挥作用了,super本质上是一个类,内部记录着MRO信息,由于C3算法确保同一个类只会被搜寻一次,这样就避免了顶层父类中的方法被多次执行了,上面代码可以改为:

    class A():
     def __init__(self):
     print('init A...')
     print('end A...')
    
    class B(A):
     def __init__(self):
     print('init B...')
     super(B, self).__init__()
     print('end B...')
    
    class C(A):
     def __init__(self):
     print('init C...')
     super(C, self).__init__()
     print('end C...')
    
    class D(B, C):
     def __init__(self):
     print('init D...')
     super(D, self).__init__()
     print('end D...')
    
    if __name__ == '__main__':
     D()

    输出结果:

    init D...
    init B...
    init C...
    init A...
    end A...
    end C...
    end B...
    end D...

    可以看出,此时的调用顺序是D->B->C->A。即采用是广度优先的遍历方式。

    补充内容

    Python类分为两种,一种叫经典类,一种叫新式类。都支持多继承,但继承顺序不同。

  • 新式类:从object继承来的类。(如:class A(object)),采用广度优先搜索的方式继承(即先水平搜索,再向上搜索)。
  • 经典类:不从object继承来的类。(如:class A()),采用深度优先搜索的方式继承(即先深入继承树的左侧,再返回,再找右侧)。
  • Python2.x中类的是有经典类和新式类两种。Python3.x中都是新式类。

    更多python相关教程,请关注python教程栏目。

    文档

    Python多重继承中的菱形继承

    Python多重继承中的菱形继承:本篇文章介绍了Python多重继承中,菱形继承的的用法,希望对学习Python中的朋友有帮助!继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inh
    推荐度:
    标签: python python的 继承
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top