Python 多继承与MRO-C3算法
Posted longxd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 多继承与MRO-C3算法相关的知识,希望对你有一定的参考价值。
继承关系图:树结构
广度优先遍历:先找A,再找B、C,最后找D、E。(顺序:A、B、C)
深度优先遍历:先找A,再找B,接着找D、E(把B里面找完);然后找C。(顺序:A、B、D、E、C)
MRO-C3 算法:很像深度优先遍历,但不是。(注意:树结构)
范例演示:定义类时保持和上图一样的数结构。
>>> class D: name = \'d\' >>> class E: pass >>> class C: name = \'c\' >>> class B(D,E): #继承多个父类,如:遗传爸爸和妈妈的基因。 pass >>> class A(B,C): #继承多个类,如:爸爸和妈妈都会吃饭,但是每个人吃饭的方式不一样,看如何遗传 pass >>> print(A.name) #类A继承了B类和C类,它会先去B类(B类继承了D类和E类)里面,找结果是pass;然后去B类里面的D类找,结果用name属性。
#如果还没有的话就回去E类里面找。 d >>>
>>> print(A.mro()) #mro()方法,是在类里面的,它会自己计算出搜索顺序。【MRO-C3算法】
[<class \'__main__.A\'>, <class \'__main__.B\'>, <class \'__main__.D\'>, <class \'__main__.E\'>, <class \'__main__.C\'>, <class \'object\'>]
>>>
违犯MRO-C3规则的树结构:由于冲突导致的不能继承。
范例演示:验证违犯MRO-C3规则的树结构。
>>> class A: #爸爸 pass >>> class B: #妈妈 pass >>> class C(A,B): #儿子,先继承爸爸的属性 pass >>> class D(B,A): #女儿,先继承妈妈的属性 pass >>> class E(C,D):
#会报错,因为这个树结构是违法MRO-C3规则的。由于冲突导致的不能继承。
#这个类E继承了儿子和女儿的属性;近亲不能结婚。 pass Traceback (most recent call last): File "<pyshell#32>", line 1, in <module> class E(C,D): TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B >>>
以上是关于Python 多继承与MRO-C3算法的主要内容,如果未能解决你的问题,请参考以下文章