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