亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python類中super() 的使用解析

 更新時間:2019年12月19日 10:08:56   作者:larryli007  
super() 函數(shù)是用于調(diào)用父類(超類)的一個方法。這篇文章主要介紹了python類中super() 的使用,需要的朋友可以參考下

描述

super() 函數(shù)是用于調(diào)用父類(超類)的一個方法。

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

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

語法

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

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

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

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

舉個例子:

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

class Dog(Animal): #定一個繼承Animal的子類
  def __init__(self): #子類的初始化函數(shù),此時會覆蓋父類Animal類的初始化函數(shù)
    print('I am son')
    self.name = 'dog' #定義子類的name屬性
    super(Dog,self).__init__() #在子類進行初始化時,也想繼承父類的__init__()就通過super()實現(xiàn)
    #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()執(zhí)行后,Dog類的name屬性被父類覆蓋
parent #繼承了父類的role屬性

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

self 和 super的區(qū)別:

  • self會首先調(diào)用自己的方法或者屬性,當自身沒有目標屬性或方法時,再去父類中尋找;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中是按照廣度優(yōu)先算法,即在類ChildC的繼承關系中,會先找到靠近其的基類ChildA,然后繼承其的初始化函數(shù)__init__(),就不會再繼承ChildB的初始化函數(shù))
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'>)

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

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

結論:

  • super()用來繼承基類的屬性和方法
  • 單繼承時,super().__init__() 和 父類.__init__()實現(xiàn)的功能是類似的
  • super不是父類,而是繼承順序的下一個類
  • super()可以避免重復調(diào)用

總結

以上所述是小編給大家介紹的python類中super() 的使用解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • python之語音識別speech模塊

    python之語音識別speech模塊

    這篇文章主要介紹了python之語音識別speech模塊,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • python并發(fā)編程多進程 模擬搶票實現(xiàn)過程

    python并發(fā)編程多進程 模擬搶票實現(xiàn)過程

    這篇文章主要介紹了python并發(fā)編程多進程 模擬搶票實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 利用Python自動化識別與刪除Excel表格空白行和列

    利用Python自動化識別與刪除Excel表格空白行和列

    在處理Excel數(shù)據(jù)時,經(jīng)常會遇到含有空白行和空白列的情況,本文將介紹如何利用Python來自動化識別并刪除Excel文件中的空白行和列,從而確保數(shù)據(jù)集的整潔性,為后續(xù)的數(shù)據(jù)分析工作奠定堅實的基礎,需要的朋友可以參考下
    2024-05-05
  • python playwright之元素定位示例詳解

    python playwright之元素定位示例詳解

    這篇文章主要為大家介紹了python playwright之元素定位示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • python實現(xiàn)五子棋程序

    python實現(xiàn)五子棋程序

    這篇文章主要為大家詳細介紹了python實現(xiàn)五子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 淺析Python中的套接字編程

    淺析Python中的套接字編程

    不可否認,互聯(lián)網(wǎng)已成為“存在之魂”,其活動以“連接”或“網(wǎng)絡”為特征。使用套接字的最關鍵的基礎之一,使這些網(wǎng)絡成為可能。本文涵蓋了有關使用Python進行套接字編程的所有領域。套接字可以幫助您建立這些連接,而Python無疑可以簡化連接
    2021-06-06
  • Tensorflow訓練模型默認占滿所有GPU的解決方案

    Tensorflow訓練模型默認占滿所有GPU的解決方案

    這篇文章主要介紹了Tensorflow訓練模型默認占滿所有GPU的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python并發(fā)執(zhí)行的幾種實現(xiàn)方法

    Python并發(fā)執(zhí)行的幾種實現(xiàn)方法

    在Python中多線程是實現(xiàn)并發(fā)的一種方式,多線程可以讓程序在同一時間內(nèi)進行多個任務,從而提高程序的效率和執(zhí)行速度,這篇文章主要給大家介紹了關于Python并發(fā)執(zhí)行的幾種實現(xiàn)方法,需要的朋友可以參考下
    2024-08-08
  • wxPython實現(xiàn)窗口用圖片做背景

    wxPython實現(xiàn)窗口用圖片做背景

    這篇文章主要為大家詳細介紹了wxPython實現(xiàn)窗口用圖片做背景,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python批量按比例縮小圖片腳本分享

    Python批量按比例縮小圖片腳本分享

    這篇文章主要介紹了Python批量按比例縮小圖片腳本分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05

最新評論