zoukankan      html  css  js  c++  java
  • 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 >>>

      

  • 相关阅读:
    序列化器:serializers(django-rest-framework)
    数据库模型:models(Django)
    AtCoder Beginner Contest 213【A
    Codeforces Round #736 (Div. 2)【ABCD】
    AtCoder Beginner Contest 212【A
    Codeforces Round #732 (Div. 2)【ABCD】
    VS201X windows下编译提示缺少ucrtbased.dll文件
    Locust1.6 从入门到实战
    如何理解Windows认证流程
    HTB::Forest
  • 原文地址:https://www.cnblogs.com/longxd/p/8747955.html
Copyright © 2011-2022 走看看