Python----多继承和MRO继承机制

【原文链接】

1、多继承

  • 首先看下面一个多继承的代码例子
class A(object):
    def func(self):
        print("in A")

class B(A):
    def func(self):
        A.func(self)
        print("in B")

class C(A):
    def func(self):
        A.func(self)
        print("in C")

class D(B,C):
    def func(self):
        B.func(self)
        C.func(self)
        print("in D")

d=D()
d.func()

执行结果如下:

in A
in B
in A
in C
in D

这里达到了继承的目的,但是有一点问题,A类作为B类和C 类的父类,这里被执行了两次,显然这种处理方式有问题,当然这段代码中也是有一点问题的,需要注意一下,python中在使用继承的时候,调用父类方法绝对不能使用父类名去调用,而是要使用super()去调用,上面这段代码就是使用了父类名去调用了,所以A类被执行了两遍

  • 再看下面一段代码
class A(object):
    def func(self):
        print("in A")

class B(A):
    def func(self):
        super().func()
        print("in B")

class C(A):
    def func(self):
        super().func()
        print("in C")

class D(B,C):
    def func(self):
        super().func()
        print("in D")

d=D()
d.func()

执行结果如下:

in A
in C
in B
in D

这里B和C顺序好像变化了,这就是根据python中MRO继承顺序机制而调用的结果

2、MRO原理

  • MRO继承顺序可以有如下规则计算出来
    • 子类永远在父类前面
    • 同一等级的类按照继承的顺序摆放
    • 根据上述两条规则确定的顺序,倒过来即为调用顺序

实例:
比如如下继承关系,按照上述规则的顺序为:D,B,C,A,反过来即为A,C,B,D,即上述代码的结果顺序
在这里插入图片描述

实例:
若类的继承关系如下图所示,则按照上述规则得出的顺序为A,B,C,D,E,F,则调用顺序为F,E,D,C,B,A
在这里插入图片描述

3、查看MRO属性的方法

  • 在实际代码调试过程中,不需要画图去分析调用顺序,python代码内置提供了一个属性,供查询类的继承关系,如下
class A(object):
    def func(self):
        print("in A")

class B(A):
    def func(self):
        super().func()
        print("in B")

class C(A):
    def func(self):
        super().func()
        print("in C")

class D(B,C):
    def func(self):
        super().func()
        print("in D")

d=D()
print(D.__mro__)
d.func()

执行结果如下:可以看出通过类的__mro__属性即可查出类的继承关系,实际结果与其一致

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
in A
in C
in B
in D
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redrose2100

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值