技術背景
python中的super,名為超類,可以簡單的理解為執行父類的__init__函式,由于在python中不論是一對一的繼承,還是一子類繼承多個父類,都會涉及到執行的先后順序的問題,那么本文就著重看下super的具體作用,
案例測驗
通過設計這樣一個案例,我們可以明確super的前后邏輯關系:先定義一個父類initial,在這個父類中有引數值param和函式func,然后用子類new來繼承父類initial,繼承之后,在子類的__init__函式中super執行的前后去列印引數值param和函式func的回傳值,相關代碼如下所示:
# 定義父類
class initial(object):
def __init__(self):
print ('This print is from initial object')
# 定義父類引數
self.param = 3
# 定義父類函式
def func(self):
return 1
# 定義子類
class new(initial):
def __init__(self):
print ('This print is from new object')
# 列印子類函式值
print (self.func())
# 執行父類初始化函式
super(new, self).__init__()
# 列印父類引數值
print(self.param)
self.param = 4
# 定義子類函式
def func(self):
return 2
if __name__ == '__main__':
new()
代碼的執行結果如下所示:
This print is from new object
2
This print is from initial object
3
結果分析
首先我們注意到,父類initial中的__init__函式內的列印陳述句,是在super之后才輸出的,這說明了,super函式是在執行父類的初始化操作,那么如果沒有執行super,new子類對initial父類的繼承體現在哪里呢?答案就是父類的成員函式,比如這樣的一個案例:
class initial(object):
def __init__(self):
print ('This print is from initial object')
self.param = 3
def func(self):
return 1
class new(initial):
def __init__(self):
print ('This print is from new object')
print (self.func())
super(new, self).__init__()
print(self.param)
self.param = 4
if __name__ == '__main__':
new()
其實就是刪掉了子類中多載的成員函式,那么得到的結果如下:
This print is from new object
1
This print is from initial object
3
可以發現在執行super之前就可以列印父類的func函式的函式值,所以python中繼承的邏輯是這樣的:
也正是因為只有執行了super才能初始化父類中的成員變數,因此如果在super之前是無法訪問父類的成員變數的,
總結概要
本文通過一個python的實際案例的設計,來講解python面向物件的技術——類的繼承中必用的super函式的邏輯,其實我們可以把python中類的繼承理解成這樣的一個程序:當我們在括號中明確了父類時,其實已經參考了父類的成員函式,但是并沒有執行父類的初始化函式,在執行子類的初始化函式的同時,會檢查是否多載了父類的成員函式,如果多載則會直接覆寫,而只有在執行了super之后,才相當于執行了父類的初始化函式,此時才可以訪問父類的成員變數,
著作權宣告
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/super.html
作者ID:DechinPhy
更多原著文章請參考:https://www.cnblogs.com/dechinphy/
打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
騰訊云專欄同步:https://cloud.tencent.com/developer/column/91958
“留一手”加劇內卷,“講不清”浪費時間,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447037.html
標籤:其他
上一篇:用python放煙花,節約又環保
下一篇:八、Java面向物件編程
