level 1
python的继承和多台通过维护类的MRO(Method Resolution Order)表来实现。
代码里加一行print(A.__mro__), 就能看出类继承的顺序:
第二段代码加上A.__mro__的输出:
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)
python 3.9.0执行结果。 说明是深度优先,然后如果有共同基类(此处为object),则执行广度优先到共同基类,再深度优先。 A-> B -> E -> (object? 共同基类,广度!) C -> D -> D -> object
A B都没有重载eat(), 所以执行E.eat()
第一段代码的 A(D,C)是会报错的, 因为C是D的子类, mro会循环...
怀疑是输错,猜测是 A(B,C):
第一段代码加上A.__mro__的输出:
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)
phthon 3.9.0执行结果。同样是前面的说明。 mro是深度优先, 但是B,C有共同的父类D, 所以在D以下执行广度优先: A -> B -> (D? 共同基类,广度!) C -> D -> object
A,B,都没有重载eat(),所以执行C.eat()
2020年10月27日 01点10分

