中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

super()函數怎么在python類中使用

發布時間:2021-03-22 17:28:33 來源:億速云 閱讀:163 作者:Leah 欄目:開發技術

本篇文章為大家展示了super()函數怎么在python類中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

描述

super() 函數是用于調用父類(超類)的一個方法。

super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鉆石繼承)等種種問題。

MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。

語法

以下是 super() 方法的語法:

super(type[, object-or-type])

Python中類的初始化都是__init__(), 所以父類和子類的初始化方式都是__init__(), 但是如果子類初始化時沒有這個函數,那么他將直接調用父類的__init__(); 如果子類指定了__init__(), 就會覆蓋父類的初始化函數__init__(),如果想在進行子類的初始化的同時也繼承父類的__init__(), 就需要在子類中顯示地通過super()來調用父類的__init__()函數。

super()在單繼承中的應用:

舉個例子:

class Animal: #定義一個父類
  def __init__(self): #父類的初始化
    self.name = 'animal'
    self.role = 'parent'
    print('I am father')

class Dog(Animal): #定一個繼承Animal的子類
  def __init__(self): #子類的初始化函數,此時會覆蓋父類Animal類的初始化函數
    print('I am son')
    self.name = 'dog' #定義子類的name屬性
    super(Dog,self).__init__() #在子類進行初始化時,也想繼承父類的__init__()就通過super()實現
    #self.name = 'dog' #若將name屬性的定義(即第10行)放在這兒,最終輸出將是dog
    
animal = Animal()
xbai = Dog()
print(xbai.name)
print(xbai.role)

輸出為:

I am father #實例化Animal類后的輸出
I am son #實例化Dog類后的輸出
I am father #實例化Dog類后的輸出
animal #由于子類初始化是在進行繼承父類初始化之前,因此super()執行后,Dog類的name屬性被父類覆蓋
parent #繼承了父類的role屬性

說明:super(Dog,self)也可以寫成super(),可以理解成super(Dog,self).__init__() == Animal.__init__(self),( super(Dog,self) == Animal ) 即其返回的是當前類的繼承順序中(針對多繼承)Dog后的一個類(也即類Animal)

self 和 super的區別:

  • self會首先調用自己的方法或者屬性,當自身沒有目標屬性或方法時,再去父類中尋找;super會直接去父類中尋找目標屬性或方法。如上述代碼中定義完第十行后,self.name的返回值為'dog',而super().name的返回值為'animal';

  • self時類,super是預編譯指令

super()在多繼承中的應用:

代碼例子:

class Base(object): #定義父類
  def __init__(self):
    print('Base create')
class ChildA(Base): #子類A
  def __init__(self):
    print('Enter A')
    super(ChildA,self).__init__()
    print('Leave A')
class ChildB(Base):
  def __init__(self):
    print('Enter B')
    super(ChildB,self).__init__()
    self.name = 'B'
    print('Leave B')
class ChildC(ChildA,ChildB):#在繼承時,按照繼承順序返回繼承順序的下一個類
  pass
## (這里需要介紹的是,當類繼承多個類時,python3中是按照廣度優先算法,即在類ChildC的繼承關系中,會先找到靠近其的基類ChildA,然后繼承其的初始化函數__init__(),就不會再繼承ChildB的初始化函數)
c = ChildC() #實例化對象
print(c.__class__.__mro__) #對象c的繼承順序應該是 ChildC---ChildA---ChildB---Base---object

輸出結果:

Enter A
Enter B
Base create
Leave B
Leave A
(<class '__main__.ChildC'>, <class '__main__.ChildA'>, <class '__main__.ChildB'>, <class '__main__.Base'>, <class 'object'>)

整個執行過程,當實例化對象c時,按照類的繼承順序,先初始化類ChildC(),由于C中未定義初始化函數__init__(),因此直接調用其繼承的基類ChildA的__init__()初始化方法,運行到代碼行第8行時,按照繼承順序super(ChildA,self)返回的是類ChildB(),因此,super(ChildA,self).__init__() == ChildB().__init__(self),因此就可以理解產生輸出結果的原理。

從super()方法中可以看出,super()的第一個參數可以是繼承鏈(繼承順序)中的任意一個類的名字,也可以不填,不填時第一個參數默認為當前類,即代碼第10行 super(ChildA,self).__init__() ==super().__init__(),其返回值為在繼承鏈中輸入參數類的下一個類。

結論:

  • super()用來繼承基類的屬性和方法

  • 單繼承時,super().__init__() 和 父類.__init__()實現的功能是類似的

  • super不是父類,而是繼承順序的下一個類

  • super()可以避免重復調用


上述內容就是super()函數怎么在python類中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会宁县| 鄂温| 曲水县| 长海县| 四子王旗| 景谷| 渝中区| 栖霞市| 青冈县| 哈密市| 新安县| 拉孜县| 偃师市| 西城区| 嘉祥县| 伊吾县| 长阳| 龙泉市| 桂平市| 华亭县| 涞源县| 宿州市| 三亚市| 大英县| 泸定县| 城固县| 大邑县| 金堂县| 荥阳市| 贵溪市| 渑池县| 开江县| 咸丰县| 交城县| 军事| 嘉黎县| 镇远县| 嘉鱼县| 东辽县| 岚皋县| 诸暨市|