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

首先我们先定义五个类,这五个类都有相同的函数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前:
Python 多继承---------钻石继承、小乌龟继承

注释E类中func后:

Python 多继承---------钻石继承、小乌龟继承
在自身函数被注释后,执行了父类A中的函数

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

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

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

理论:当D类的func被注释掉后,执行B中的;再把B中的func注释掉,执行C的;再注释掉C的,执行A的。
我们可以通过mro方法来查看类的继承关系顺序:
Python 多继承---------钻石继承、小乌龟继承
Python 多继承---------钻石继承、小乌龟继承
图解:
Python 多继承---------钻石继承、小乌龟继承
实践操作:
首先注释掉D中的func,
Python 多继承---------钻石继承、小乌龟继承Python 多继承---------钻石继承、小乌龟继承
再注释掉B中的func,
Python 多继承---------钻石继承、小乌龟继承Python 多继承---------钻石继承、小乌龟继承

整体来看:

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())

结果:
Python 多继承---------钻石继承、小乌龟继承

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

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

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())


结果:
Python 多继承---------钻石继承、小乌龟继承

案例四: 小乌龟
它的继承关系是: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)
Python 多继承---------钻石继承、小乌龟继承实现:

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())

结果:
Python 多继承---------钻石继承、小乌龟继承

相关文章: