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算法的主要内容,如果未能解决你的问题,请参考以下文章

python多继承之C3算法

Python的多继承问题-MRO和C3算法

Python多继承解析顺序的C3线性算法流程解析

python D20 多继承C3算法super()

Python 中多继承 C3-MRO 算法的剖析

python多继承与MRO