python3中的新式类mro查看和C3算法原理

两个公式
L(object) = [object]
L(子类(父类1, 父类2)) = [子类] + merge(L(父类1), L(父类2) , [父类1, 父类2])
注意
+ 代表合并列表
merge算法
1. 第一个列表的第一个元素
是后续列表的第一个元素
或者
后续列表中没有再次出现
则将这个元素合并到最终的解析列表中
并从当前操作的所有列表中删除
2. 如果不符合,则跳过此元素,查找下一个列表的第一个元素,重复1的判断规则
3. 如果最终无法把所有元素归并到解析列表, 则报错

# 菱形继承
class D(object):
    pass
# L(D(objecj)) = [D] + mearge(L(object), [object])
#              = [D] + mearge([object], [object])
#              = [D] + mearge([], [])
#              = [D, object]


class B(D):
    pass
# L(B(D)) = [B] + mearge(L(D), [D])
#         = [B] + mearge([D, object], [D])
#         = [B, D] + mearge([object], [])
#         = [B, D, object] + mearge([], [])
#         = [B, D, object]


class C(D):
    pass
# L(C(D)) = [C] + mearge(L(D), [D])
#         = [C] + mearge([D, object], [D])
#         = [C, D] + mearge([object], [])
#         = [C, D, object] + mearge([], [])
#         = [C, D, object]


class A(B, C):
    pass
# L(A) = [A] + mearge(L(B), L(C), [B, C])
#      = [A] + mearge([B, D, object],[C, D, object], [B, C])
#      = [A, B] + mearge([D, object],[C, D, object], [C])
#      = [A, B, C] + mearge([D, object],[D, object])
#      = [A, B, C, D] + mearge([object],[object])
#      = [A, B, C, D, object] + mearge([],[])
#      = [A, B, C, D, object]

print(A.mro())
print(A.__mro__)
import inspect
print(inspect.getmro(A))

猜你喜欢

转载自www.cnblogs.com/chen55555/p/10274310.html