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
2this 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
1this print is from initial object
3
可以發現在執行super之前就可以列印父類的func
函式的函式值。所以python中繼承的邏輯是這樣的:
\[initial.func()\\
\downarrow\\
new.\_\_init\_\_()\\
\downarrow\\
new.func()/new.param\\
\downarrow\\
super()\\
\downarrow\\
initial.\_\_init\_\_()/initial.param\\
\downarrow\\
new.\_\_init\_\_()/new.param
\]也正是因為只有執行了super
才能初始化父類中的成員變數,因此如果在super之前是無法訪問父類的成員變數的。
本文通過乙個python的實際案例的設計,來講解python物件導向的技術——類的繼承中必用的super函式的邏輯。其實我們可以把python中類的繼承理解成這樣的乙個過程:當我們在括號中明確了父類時,其實已經引用了父類的成員函式,但是並沒有執行父類的初始化函式。在執行子類的初始化函式的同時,會檢查是否過載了父類的成員函式,如果過載則會直接覆蓋。而只有在執行了super之後,才相當於執行了父類的初始化函式,此時才可以訪問父類的成員變數。
本文首發鏈結為:
作者id:dechinphy
更多原著文章請參考:
python結果 Python中 的結果是什麼?
像這樣的表情x y計算為x y.優先順序與運算子相同。分組 及 乘法 9 2 9 2 9除以2等於4。4乘2等於8 9減8是1 剩餘部分。python抓到了 取決於您使用的python版本,也是 不推薦的 字串內插運算子,因此請注意,如果您來自具有自動型別轉換 如php或js 的語言,其中的表示式如...
python中的鍵 python中鍵值是什麼?
你說得就是python中的字典物件 它是由鍵值對這樣的資料組成,以下內容來自 python成為專業人士筆記 dictionary字典介紹 字典是鍵值儲存的乙個例子,在python中也稱為對映。它允許您通過引用鍵來儲存和檢索元素。由於字典是按鍵引用的,所以查詢速度非常快。由於它們主要用於按鍵去索引所有...
Python中super的用法
super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...