前些天朋友给了我一大串代码,让我猜猜输出结果,我想着,行呗,试试就试试。结果大失所望。
宝宝心里苦啊~~~,呜呜呜
给你们看看代码吧。
class A():
def __init__(self):
print('A开始')
print('A结束')
class B(A):
def __init__(self):
print('B开始')
super().__init__()
print('B结束')
class C(A):
def __init__(self):
print('C开始')
super().__init__()
print('C结束')
class D(B,C):
def __init__(self):
print('D开始')
super().__init__()
print('D结束')
d=D()
print(D.mro())
其实它就是python中类的多继承,那么多继承有什么规则呢?
#比如:
class A():
pass
class B():
pass
class C(A,B):
pass
class D(B,A):
pass
在上面,A和B显然是父类,C和D显然是子类,但是C和D又分别继承了A和B,那你们猜一猜如果以上的父类和子类下有方法的话,那么调用C和D(假如说分别调用了父类的方法)会出现什么结果呢?
答案是毋庸置疑的,会根据子类里面的继承顺序进行继承,C类继承的是A和B,那么如果同时调用父类的方法,他是会先调用父类A中的方法再调用父类B中的方法。你们下去可以试一试,把代码补全,然后调用类看输出结果。
好了,回到我们上面的那个问题。上面代码的输出结果是:
你有没有猜对呢?
我刚才给大家说了一下多继承的顺序,你们再往回看是不是有点懵呢?哈哈哈,这才是我想要的结果。
多继承的顺序确实是有先后规则的,但是mro表默认给了类的调用顺序,所以类的普通继承顺序就不好用了。
明白了吗?
MRO表是一种多重继承中用于确定方法搜索顺序的算法,又称C3超类线性话。python会计算出每一类的MRO列表。一个类的 MRO 列表是一个包含了其继承链上所有基类的线性顺序列,并且列表中的每一项均保持唯一。当需要在继承链中寻找某个属性时,Python会在 MRO 列表中从左到右开始查找各个基类,直到找到第一个匹配这个属性的类为止。
MRO列表遵循以下三条规则:
- 子类会先于父类被检查
- 多个父类会根据他们在列表中的顺序被检查。
- 如果对下一个类存在两个合法的选择, 选择第一个父类。
python中的相关属性:
class.mro():这个打印出的是多继承类中的继承顺序表,他的数据类型是一个列表。
class.mro:这个和上面的意义是一样的,不过他的数据类型是一个元组。
好了,现在你明白了吗?赶快下去试一试吧!