多继承原理c3算法。两个继承的python为广度优先

class H:
    def bar(self):
        print("h bar")

class G(H):
    def bar(self):
        print("g bar")

class F(H):
    def bar(self):
        print("f bar")

class E(G):
    def bar(self):
        print("e bar")


class D(F):
    def bar(self):
        print("d bar")

class C(E):
    def bar(self):
        print("c bar")

class B(D):
    def bar(self):
        print("b bar")

class A(B,C,D):
    def bar(self):
        print("a bar")

print(A.mro())  # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>,
#  <class '__main__.E'>, <class '__main__.G'>, <class '__main__.H'>, <class 'object'>]
# [B,C,D]
#[B.D.F,H], [C,E,G,H],[D,F,H]
# c3算法
# 先找B头,放到一个列表里面,
#[B,C,D.F,E,G,H]    # [H], [E,G,H],[H] []
# c3算法就是先把继承关系最下面A的父类找出来。再以每个父类为头[B,C,D],找到其所有的父类[B.D.F,H], [C,E,G,H],[D,F,H]。然后以[B,C,D]中B开头,发现有两个B头
#第一个为B,去掉每个列表里面的B,同理得到C,D。这样继承顺序为B,C,D [],[F,H] [E,G,H],[F,H],再看剩下的列表里面,F开头的比E多,取F,去掉F,[H], [E,G,H],[H]
# 现在发现H有两个头,但是还有一个H不在头上,不取,所以依次取E,G,H

 

posted @ 2019-03-25 21:08  杨fj  阅读(128)  评论(0编辑  收藏  举报