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