类多继承C3算法

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


class G(H):
    def bar(self):
        print("F.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")


a = A()
print(A.mro())
# 结果
# [, , , , , , , , ]

是按照C3算法来的
下面是推倒的过程
类多继承C3算法_第1张图片
类多继承C3算法_第2张图片

A(B,C,D)

首先找到A继承的三个类的深度继承顺序,放到一个列表中
L[B] = [B,D,F,H] #B往上面的继承顺序
L[C] = [C,E,G,H] #C往上面的继承顺序
L[D] = [D,F,H] #D往上面的继承顺序
第二步:A自己的广度,第一层
L[A] = [B,C, D]
list = [A,B,C,D,F,E,G,H,O]

每个列表的第一个元素为头部,从第一个列表的头部开始找,找其他列表中尾部是否含有这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D]
2 [D,F,H] [C,E,G, H] [D,F,H] [C,D] #提取了头部的B,然后将其他列表头部的B删除,并将B放到list中
3 [D,E,H] [E,G,H] [D,F,H] [D] #因为第一个列表的D在其他列表的尾部存在,所以跳过D,然后找第二个列表的头部C,提取了头部的C,然后将其他列表头部的B删除,将B放到list中
4 [H] [H] [H] []

“”"

你可能感兴趣的:(Python基础,python,多继承)