python中的super如何使用
技術(shù)背景
python中的super,名為超類,可以簡(jiǎn)單的理解為執(zhí)行父類的__init__函數(shù)。由于在python中不論是一對(duì)一的繼承,還是一子類繼承多個(gè)父類,都會(huì)涉及到執(zhí)行的先后順序的問題。那么本文就著重看下super的具體作用。
案例測(cè)試
通過設(shè)計(jì)這樣一個(gè)案例,我們可以明確super的前后邏輯關(guān)系:先定義一個(gè)父類initial,在這個(gè)父類中有參數(shù)值param和函數(shù)func,然后用子類new來繼承父類initial。繼承之后,在子類的__init__函數(shù)中super執(zhí)行的前后去打印參數(shù)值param和函數(shù)func的返回值,相關(guān)代碼如下所示:
# 定義父類
class initial(object):
def __init__(self):
print ('This print is from initial object')
# 定義父類參數(shù)
self.param = 3
# 定義父類函數(shù)
def func(self):
return 1
# 定義子類
class new(initial):
print ('This print is from new object')
# 打印子類函數(shù)值
print (self.func())
# 執(zhí)行父類初始化函數(shù)
super(new, self).__init__()
# 打印父類參數(shù)值
print(self.param)
self.param = 4
# 定義子類函數(shù)
return 2
if __name__ == '__main__':
new()代碼的執(zhí)行結(jié)果如下所示:
This print is from new object
2
This print is from initial object
3
結(jié)果分析
首先我們注意到,父類initial中的__init__函數(shù)內(nèi)的打印語句,是在super之后才輸出的,這說明了,super函數(shù)是在執(zhí)行父類的初始化操作。那么如果沒有執(zhí)行super,new子類對(duì)initial父類的繼承體現(xiàn)在哪里呢?答案就是父類的成員函數(shù),比如這樣的一個(gè)案例:
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()其實(shí)就是刪掉了子類中重載的成員函數(shù),那么得到的結(jié)果如下:
This print is from new object
1
This print is from initial object
3
可以發(fā)現(xiàn)在執(zhí)行super之前就可以打印父類的func函數(shù)的函數(shù)值。所以python中繼承的邏輯是這樣的:

也正是因?yàn)橹挥袌?zhí)行了super才能初始化父類中的成員變量,因此如果在super之前是無法訪問父類的成員變量的。
總結(jié)概要
本文通過一個(gè)python的實(shí)際案例的設(shè)計(jì),來講解python面向?qū)ο蟮募夹g(shù)——類的繼承中必用的super函數(shù)的邏輯。其實(shí)我們可以把python中類的繼承理解成這樣的一個(gè)過程:當(dāng)我們?cè)诶ㄌ?hào)中明確了父類時(shí),其實(shí)已經(jīng)引用了父類的成員函數(shù),但是并沒有執(zhí)行父類的初始化函數(shù)。在執(zhí)行子類的初始化函數(shù)的同時(shí),會(huì)檢查是否重載了父類的成員函數(shù),如果重載則會(huì)直接覆蓋。而只有在執(zhí)行了super之后,才相當(dāng)于執(zhí)行了父類的初始化函數(shù),此時(shí)才可以訪問父類的成員變量。
版權(quán)聲明
本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/super.html
作者ID:DechinPhy
更多原著文章請(qǐng)參考:https://www.cnblogs.com/dechinphy/
打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
騰訊云專欄同步:https://cloud.tencent.com/developer/column/91958
到此這篇關(guān)于python中的super是什么?的文章就介紹到這了,更多相關(guān)python中的super內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python結(jié)合PyWebView庫(kù)打造跨平臺(tái)桌面應(yīng)用
隨著Web技術(shù)的發(fā)展,將HTML/CSS/JavaScript與Python結(jié)合構(gòu)建桌面應(yīng)用成為可能,本文將系統(tǒng)講解如何使用PyWebView庫(kù)實(shí)現(xiàn)這一創(chuàng)新方案,希望對(duì)大家有一定的幫助2025-04-04
解決Python報(bào)錯(cuò):ValueError:operands?could?not?be?broadcast?t
這篇文章主要給大家介紹了關(guān)于解決Python報(bào)錯(cuò):ValueError:operands?could?not?be?broadcast?together?with?shapes的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Python異常處理與反射相關(guān)問題總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著Python異常處理與反射展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
python 使用uiautomator2連接手機(jī)設(shè)備的實(shí)現(xiàn)
這篇文章主要介紹了python 使用uiautomator2連接手機(jī)設(shè)備的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
tensorboard 可視化之localhost:6006不顯示的解決方案
這篇文章主要介紹了tensorboard 可視化之localhost:6006不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05

