# 菱形继承
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))