super()返回一个代理对象,用于调用父类方法,调用此代理对象的方法时,查找相应方法的顺序是按照__mro__列表的返回顺序进行调用方法查找的。python
so.....函数
# -*- coding:utf-8 -*- # 2017/6/29 class A(object): def __init__(self): print "A init invoked" class B(object): def __init__(self): print "B init invoked" class D(object): def __init__(self): print "D init invoked" class C(D, B, A): def __init__(self): print "C init invoked", C.mro() super(C, self).__init__() c = C()
输出: D:\Python27\python.exe E:/workspace/lab_for_py/python-example-code/super_code/test.py C init invoked [<class '__main__.C'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <type 'object'>] D init invoked Process finished with exit code 0
可见super()函数参数为C,self的时候,__init__调用的是D中的方法,那咱们换一个参数试试,将C分别换成D,B,A对应输出分别是spa
D:B init invoked代理
B:A init invokedcode
A:无输出对象
咱们再看一下mro的输出utf-8
[<class '__main__.C'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <type 'object'>]
可见,super(type[, object-or-type])调用的父类方法是选用的mro list相应type下一个类的方法,那么当参数为A的时候,输出为空的缘由就显而易见了,由于当参数为A时,实际上调用的是type类的__init__方法。it