longxd

导航

 

继承关系图:树结构

广度优先遍历:先找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 >>>

  

 

posted on 2018-04-08 22:27  longxd  阅读(136)  评论(0编辑  收藏  举报