多继承补充

面向对象多继承

1. __mro__和c3算法详解
    
    (1 )__mro__:
        python 类有多继承特性,如果继承关系太复杂,很难看出会先调用那个属性或方法。
为了方便且快速地看清继承关系和顺序,可以用__mro__方法来获取这个类的调用顺序。
    
    (2) c3算法
    ss A(object):
        pass
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    class D(object):
        pass
    
    class E(D,C):
        pass
    
    class F(object):
        pass
    
    class G(F):
        pass
    
    class H(C,G):
        pass
    
    class Foo(E,H):
        pass
    
    
    # print(E.__mro__)
    # print(H.__mro__)
    """
    L(Foo + L(E)  + L(H) )
    
    L(E) = E,D,C,B,A,object
    L(H) = H,C,B,A,G,F,object
    
    Foo = (object) + (G,F,object)
    Foo,E,D,H,C,B,A,G,F,object
    """
    print(Foo.__mro__)

2. 经典类和新式类
    a. 先找左再找右
        class A(object):
            pass
    
        class B(object):
            def f1(self):
                print('B')
    
        class C(A, B):
            pass
    
        obj = C()
        obj.f1()
    
    b. 经典类和新式类
        py2:
            经典类: 
            新式类: 如果自己或自己的前辈只要有人继承了object, 那么此类就是新式类
        py3:
            新式类
            
        经典类和新式类的查找成员的顺序不一样.
            经典类, 一条道走到黑(深度优先).
            新式类, C3算法实现(python2.3更新时c3算法)
            
                Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W) 
                    
                FOO,
                    获取第一个表头 和 其他表位进行比较
                        不存在则拿走
                        如果存在, 则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较
                
        简答,
            经典类, 一条道走到黑(深度优先)
            新式类, 留个根.(科学c3算法)
    
        注意事项:
            super是遵循__mro__执行顺序
原文地址:https://www.cnblogs.com/kangqi452/p/11617539.html