Python 多继承---------钻石继承、小乌龟继承

当一个类继承多个类 的时候,并且都有同名函数时,继承的顺序,以广度优先为主。

首先我们先定义五个类,这五个类都有相同的函数func,以便观看执行顺序:

class A():
    def func(self):
        print('A')
class B():
    def func(self):
        print('B')
class C():
    def func(self):
        print('C')

class D():
    def func(self):
        print('D')
class E():
    def func(self):
        print('E')


案例一:
E类继承ABCD四个类,并且注释掉E类的func方法,观看哪个父类的func被执行:
理论上:当E中方法被注释掉后,应该执行A中的func;同理,当A中方法被注释掉后,应该执行B中的func方法 ……………………等等。

class A():
    def func(self):
        print('A')
class B():
    def func(self):
        print('B')
class C():
    def func(self):
        print('C')

class D():
    def func(self):
        print('D')
class E(A,B,C,D):
    def func(self):
        print('E')

e=E()
e.func() 

注释E类中func前:
在这里插入图片描述

注释E类中func后:

在这里插入图片描述
在自身函数被注释后,执行了父类A中的函数

同理:我们再注释掉A类中的func的函数

在这里插入图片描述在这里插入图片描述

案例二: 钻石继承
这里我们操作D类,让D类继承B、C两个类,并且B、C两个类都继承A类:

理论:当D类的func被注释掉后,执行B中的;再把B中的func注释掉,执行C的;再注释掉C的,执行A的。
我们可以通过mro方法来查看类的继承关系顺序:
在这里插入图片描述
在这里插入图片描述
图解:
在这里插入图片描述
实践操作:
首先注释掉D中的func,
在这里插入图片描述在这里插入图片描述
再注释掉B中的func,
在这里插入图片描述在这里插入图片描述

整体来看:

class A():
    def func(self):
        print('A')

class B(A):
    def func(self):
        print('B')
        super().func()
class C(A):
    def func(self):
        print('C')
        super().func()

class D(B,C):
    def func(self):
        print('D')
        super().func()
       
d=D()
d.func()
print(D.mro())

结果:
在这里插入图片描述

案例三:
D继承B,C两个类,B又继承A,C又继承E

在这里插入图片描述

class A():
    def func(self):
        print('A')
        super().func()#在这里 A类看起来是没有继承类的,所以在Pycharm中这条语句会有个阴影提示没有func方法,但是在mro中可以看到他是继承C类的
    # pass


class E():
    def func(self):
        print('E')

class B(A):
    def func(self):
        print('B')
        super().func()
class C(E):
    def func(self):
        print('C')
        super().func()

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



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


结果:
在这里插入图片描述

案例四: 小乌龟
它的继承关系是:D类继承B、C两个类,B又继承A,A又继承F,C继承E,E又继承F
理论:由广度优先可以得出,先是输出D,然后输出B,但是如果下一个为C时,这样就无法联系到A了,所以下一个为A 在此D——》B——》A ,接下来可以广度优先了,到C,再到E最后到F 结果:(D——》B——》A——》C——》E——》F)
在这里插入图片描述实现:

class F():
    def func(self):
        print("F")
class A(F):
    def func(self):
        print('A')
        super().func()


class E(F):
    def func(self):
        print('E')
        super().func()

class B(A):
    def func(self):
        print('B')
        super().func()
class C(E):
    def func(self):
        print('C')
        super().func()

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



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

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值