super函數(shù)是一個很好的改寫父類的方法次舌,前幾天剛好接觸到了這個函數(shù)兽愤,就研究了一下彼念。
用法
super() 函數(shù)是用于調(diào)用父類(超類)的一個方法浅萧。
super 是用來解決多重繼承問題的逐沙,直接用類名調(diào)用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承洼畅,會涉及到查找順序(MRO)吩案、重復(fù)調(diào)用(鉆石繼承)等種種問題。
super的語法比較簡單:super(type[, object-or-type])帝簇,參數(shù) type -- 類 object-or-type -- 類靠益,一般是 self 残揉。
Python3.x 和 Python2.x 的一個區(qū)別是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
實例:
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
super().__init__()#假設(shè)要是python2就應(yīng)當(dāng)寫super(B胧后,self).__init__
print('B')
b=B()
它的本意就是對父類的方法進行拓展抱环,不必直接到父類的代碼進行修改壳快。
一些拓展
單純的討論super函數(shù)其實沒有問題镇草,但是一旦涉及到多重繼承眶痰,就涉及到python中的繼承問題
深度優(yōu)先與廣度優(yōu)先
首先無論是深度優(yōu)先還是廣度優(yōu)先梯啤,在調(diào)用時會率先調(diào)用最近的類。例如class B(A,C,D)就會先調(diào)用A因宇,再調(diào)用C,最后是D。
python3中優(yōu)先采用的繼承順序是廣度優(yōu)先肩袍,在查詢時率先把本層的全部查詢完才進入下一層
例如上面兩個圖氛赐,圖一的調(diào)用順序就是A>B>C>D>E,圖二就是A>B>C>D
而在python2中魂爪,默認經(jīng)典類艰管,采用的是深度優(yōu)先的算法。查詢時撩笆,先走一條路走到最深層次缸浦,才走另一條路。對應(yīng)到上圖就是A>B>D>C>E,A>B>D>C裂逐。