最近在写代码的时候遇到了一个问题,直接实例上代码
#encoding: utf-8
class A(object):
def __init__(self):
print "Enter A"
# super(A, self).__init__()
class B(object):
def __init__(self):
print "Enter B"
super(B, self).__init__()
class C(A, B):
def __init__(self):
print "Enter C"
super(C, self).__init__()
#print "MRO:", [x.__name__ for x in C.__mro__]
c = C()
本来A中的super是忘了写的,MRO那个也没有。直接运行了以后发现了一个怪现象,不是预期中的:C A B,执行结果如下:
Enter C
Enter A
然后就凌乱了,为啥呢,为什么没有调用所有父类的初始化方法,为啥~~
后来检查发现好像少了点啥东西,把super加上以后再执行就正常了。
突然意识到忽略了多重继承中的一个东东:MRO。所以加了下面那个打印,又再网上搜了搜。找到一个很精辟的总结:
super并不像它的名字那样,只调用父类的方法,而是调用MRO中,下一个类型的方法。
所以很明显为啥之前会那样输出了,总算对MRO有了一点更深刻的认识~
参考(感谢这位tx的总结):
http://blog.csdn.net/seizef/article/details/5310107