十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要为大家展示了“Python中多重继承之菱形继承的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中多重继承之菱形继承的示例分析”这篇文章吧。
10年积累的成都做网站、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有蕲春免费网站建设让你可以放心的选择与我们合作。继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。
语法
class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...): pass
菱形继承
在多层继承和多继承同时使用的情况下,就会出现复杂的继承关系,多重多继承。
其中,就会出现菱形继承。如下图所示。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中多重继承之菱形继承的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。