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.如果对下一个类存在两个合法的选择,选择第一个父类
'''

 

posted on 2024-06-26 11:00  与太阳肩并肩  阅读(2)  评论(0编辑  收藏  举报

导航