Day29.菱形问题与MRO介绍
1.菱形问题与MRO介绍_菱形继承的解释及初步案例
'''菱形继承:一个子类继承的多个父类,多个父类最总汇聚到一个非object类上的过程叫菱形继承''' # 案例场景:类C继承类A和B,类A和B都是继承G class G: pass class A(G): def test(self): print('from A') class B(G): def test(self): print('from B') class C(A, B): def test(self): print('from C')
2.菱形问题与MRO介绍_多继承带来的菱形问题
class A(object): def test(self): print('from A') pass class B(A): def test(self): print('from B') pass class C(A): def test(self): print('from C') pass class D(C, B): # def test(self): # print('from D') pass print('类.mro()的的列表顺序,查找类下函数方法'.center(40, '-')) print(D.mro()) # 类D以及类D的对象访问属性都是参照该类的mro列表 ''' 类D继承类B,C,如果类B,C没有test()函数,会进入类B,C继承的类A,查看类A中是否有test()函数,如果该过程中类A,B,C中有test()函数, 则直接执行test()函数,如果没有会进入默认继承类object中查看是否有test()函数,会报错, 在如果D继承类B,C中都有test()函数,那么 D(C,B), 继承的谁在前,就先打印在前类下的test()输出 ''' obj = D() obj.test() # 结果:from B # print(C.mro()) # 类C以及类C的对象访问属性都是参照该类的mro列表 ''' 总结:类相关的属性查找(类名.属性,该类的对象.属性)参照,都是参照类.mro()的的列表顺序 1.子类会先于父类被检查 2.多个父类会根据它们在列表中的顺序被检查 3.如果对下一个类存在两个合法的选择,选择第一个父类 '''