最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python類中super() 的使用解析

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

描述

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

super 是用來(lái)解決多重繼承問(wèn)題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒(méi)問(wèn)題,但是如果使用多繼承,會(huì)涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問(wèn)題。

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

語(yǔ)法

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

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

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

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

舉個(gè)例子:

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

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

輸出為:

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

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

self 和 super的區(qū)別:

  • self會(huì)首先調(diào)用自己的方法或者屬性,當(dāng)自身沒(méi)有目標(biāo)屬性或方法時(shí),再去父類中尋找;super會(huì)直接去父類中尋找目標(biāo)屬性或方法。如上述代碼中定義完第十行后,self.name的返回值為'dog',而super().name的返回值為'animal';
  • self時(shí)類,super是預(yù)編譯指令

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

代碼例子:

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):#在繼承時(shí),按照繼承順序返回繼承順序的下一個(gè)類
  pass
## (這里需要介紹的是,當(dāng)類繼承多個(gè)類時(shí),python3中是按照廣度優(yōu)先算法,即在類ChildC的繼承關(guān)系中,會(huì)先找到靠近其的基類ChildA,然后繼承其的初始化函數(shù)__init__(),就不會(huì)再繼承ChildB的初始化函數(shù))
c = ChildC() #實(shí)例化對(duì)象
print(c.__class__.__mro__) #對(duì)象c的繼承順序應(yīng)該是 ChildC---ChildA---ChildB---Base---object

輸出結(jié)果:

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

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

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

結(jié)論:

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

總結(jié)

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

相關(guān)文章

  • 將Django項(xiàng)目部署到CentOs服務(wù)器中

    將Django項(xiàng)目部署到CentOs服務(wù)器中

    今天小編就為大家分享一篇關(guān)于將Django項(xiàng)目部署到CentOs服務(wù)器中的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Python編程中*args與**kwargs區(qū)別作用詳解

    Python編程中*args與**kwargs區(qū)別作用詳解

    這篇文章主要介紹了Python編程中*args與**kwargs區(qū)別作用詳解
    2021-10-10
  • python中實(shí)現(xiàn)精確的浮點(diǎn)數(shù)運(yùn)算詳解

    python中實(shí)現(xiàn)精確的浮點(diǎn)數(shù)運(yùn)算詳解

    計(jì)算機(jī)智能處理可數(shù)集合的運(yùn)算,但是全體實(shí)數(shù)是不可數(shù)的,所以計(jì)算機(jī)只能用一些奇怪的方法來(lái)擬合他,于是就產(chǎn)生了浮點(diǎn)數(shù)。下面這篇文章主要給大家介紹了關(guān)于python中實(shí)現(xiàn)精確浮點(diǎn)數(shù)運(yùn)算的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 通過(guò)python掃描二維碼/條形碼并打印數(shù)據(jù)

    通過(guò)python掃描二維碼/條形碼并打印數(shù)據(jù)

    這篇文章主要介紹了通過(guò)python掃描二維碼/條形碼并打印數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • python調(diào)用Matplotlib繪制分布點(diǎn)圖

    python調(diào)用Matplotlib繪制分布點(diǎn)圖

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python連接Mysql實(shí)現(xiàn)圖書借閱系統(tǒng)

    Python連接Mysql實(shí)現(xiàn)圖書借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python連接Mysql實(shí)現(xiàn)圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 基于OpenCV的路面質(zhì)量檢測(cè)的實(shí)現(xiàn)

    基于OpenCV的路面質(zhì)量檢測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了基于OpenCV的路面質(zhì)量檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 對(duì)python實(shí)現(xiàn)二維函數(shù)高次擬合的示例詳解

    對(duì)python實(shí)現(xiàn)二維函數(shù)高次擬合的示例詳解

    今天小編就為大家分享一篇對(duì)python實(shí)現(xiàn)二維函數(shù)高次擬合的示例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python 中 list 的各項(xiàng)操作技巧

    Python 中 list 的各項(xiàng)操作技巧

    最近在學(xué)習(xí) python 語(yǔ)言。大致學(xué)習(xí)了 python 的基礎(chǔ)語(yǔ)法。覺(jué)得 python 在數(shù)據(jù)處理中的地位和它的 list 操作密不可分,今天把相關(guān)基礎(chǔ)操作記錄到腳本之家平臺(tái),需要的的朋友參考下
    2017-04-04
  • 淺談pandas中shift和diff函數(shù)關(guān)系

    淺談pandas中shift和diff函數(shù)關(guān)系

    下面小編就為大家分享一篇淺談pandas中shift和diff函數(shù)關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論

南丹县| 松原市| 申扎县| 建宁县| 临高县| 横峰县| 略阳县| 桐乡市| 和硕县| 扬中市| 广德县| 大荔县| 中牟县| 南木林县| 贵阳市| 临潭县| 和政县| 民乐县| 乌海市| 鲜城| 股票| 屯留县| 迁西县| 伊吾县| 潞城市| 华池县| 清原| 铁岭市| 福贡县| 舞钢市| 葫芦岛市| 文化| 当阳市| 蕉岭县| 阿拉善左旗| 镇康县| 连江县| 萨迦县| 江都市| 阜城县| 鹿邑县|