日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础教程:super()方法详解

發布時間:2025/3/20 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础教程:super()方法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、單獨調用父類的方法

需求:編寫一個類,然后再寫一個子類進行繼承,使用子類去調用父類的方法1。

使用方法1打印: 胖子老板,來包檳榔。

那么先寫一個胖子老板的父類,執行一下:

class FatFather(object):def __init__(self, name):print('FatFather的init開始被調用')self.name = nameprint('FatFather的name是%s' % self.name)print('FatFather的init調用結束')def main():ff = FatFather("胖子老板的父親")

運行一下這個胖子老板父類的構造方法__init__ 如下:

if __name__ == "__main__":main()FatFather的init開始被調用 FatFather的name是胖子老板的父親 FatFather的init調用結束

好了,那么下面來寫一個子類,也就是胖子老板類,繼承上面的類

胖子老板的父類

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class FatFather(object):def __init__(self, name):print('FatFather的init開始被調用')self.name = nameprint('調用FatFather類的name是%s' % self.name)print('FatFather的init調用結束')#胖子老板類 繼承 FatFather 類 class FatBoss(FatFather):def __init__(self, name, hobby):print('胖子老板的類被調用啦!')self.hobby = hobbyFatFather.__init__(self, name) #直接調用父類的構造方法print("%s 的愛好是 %s" % (name, self.hobby))def main():ff = FatFather("胖子老板的父親")fatboss = FatBoss("胖子老板", "打斗地主")

在這上面的代碼中,我使用FatFather.init(self,name)直接調用父類的方法。
運行結果如下:

if __name__ == "__main__":main()胖子老板的類被調用啦! FatFather的init開始被調用 調用FatFather類的name是胖子老板 FatFather的init調用結束 胖子老板 的愛好是 打斗地主

二、super() 方法基本概念

除了直接使用FatFather.__init__(self,name) 的方法,還可以使用super()方法來調用。

那么首先需要看super()方法的描述和語法理解一下super() 方法的使用。

1 描述

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

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

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

2 語法

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

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

參數

  • type – 類

  • object-or-type – 類,一般是 self

Python3.x 和 Python2.x 的一個區別是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :

實例:

class A:pass class B(A):def add(self, x):super().add(x)

3 單繼承使用super()

使用super() 方法來改寫剛才胖子老板繼承父類的 init 構造方法

胖子老板的父類

class FatFather(object):def __init__(self, name):print('FatFather的init開始被調用')self.name = nameprint('調用FatFather類的name是%s' % self.name)print('FatFather的init調用結束')#胖子老板類 繼承 FatFather 類 class FatBoss(FatFather):def __init__(self, name, hobby):print('胖子老板的類被調用啦!')self.hobby = hobbyFatFather.__init__(self,name) #直接調用父類的構造方法super().__init__(name)print("%s 的愛好是 %s" % (name, self.hobby))def main():ff = FatFather("胖子老板的父親")fatboss = FatBoss("胖子老板", "打斗地主") #從上面使用super方法的時候,因為是單繼承,直接就可以使用了。#運行如下:if __name__ == "__main__":main() 胖子老板的類被調用啦! FatFather的init開始被調用 調用FatFather類的name是胖子老板 FatFather的init調用結束 胖子老板 的愛好是 打斗地主那么為什么說單繼承直接使用就可以呢?因為super()方法如果多繼承的話,會涉及到一個MRO(繼承父類方法時的順序表) 的調用排序問題。

下面可以打印一下看看單繼承的MRO順序(FatBoss.mro)。

胖子老板的父類

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class FatFather(object):def __init__(self, name):print('FatFather的init開始被調用')self.name = nameprint('調用FatFather類的name是%s' % self.name)print('FatFather的init調用結束')胖子老板類 繼承 FatFather 類 class FatBoss(FatFather):def __init__(self, name, hobby):print('胖子老板的類被調用啦!')self.hobby = hobbyFatFather.__init__(self,name) 直接調用父類的構造方法super().__init__(name)print("%s 的愛好是 %s" % (name, self.hobby))def main(): print("打印FatBoss類的MRO") print(FatBoss.__mro__)print() print("=========== 下面按照 MRO 順序執行super方法 =============") fatboss = FatBoss("胖子老板", "打斗地主")

上面的代碼使用 FatBoss.mro 可以打印出 FatBoss這個類經過 python解析器的 C3算法計算過后的繼承調用順序。

運行如下:

if __name__ == "__main__":main()#打印FatBoss類的MRO (<class '__main__.FatBoss'>, <class '__main__.FatFather'>, <class 'object'>)=========== 下面按照 MRO 順序執行super方法 ============= 胖子老板的類被調用啦! FatFather的init開始被調用 調用FatFather類的name是胖子老板 FatFather的init調用結束 胖子老板 的愛好是 打斗地主

從上面的結果 <class 'main.FatBoss'>, <class 'main.FatFather'>, <class 'object'>可以看出,super() 方法在 FatBoss 會直接調用父類是 FatFather ,所以單繼承是沒問題的。

那么如果多繼承的話,會有什么問題呢?

4 多繼承使用super()

假設再寫一個胖子老板的女兒類,和 胖子老板的老婆類,此時女兒需要同時繼承 兩個類(胖子老板類,胖子老板老婆類)。

因為胖子老板有一個愛好,胖子老板的老婆需要干活干家務,那么女兒需要幫忙同時兼顧。

此時女兒就是需要繼承使用這兩個父類的方法了,那么該如何去寫呢?

下面來看看實現代碼:

# 胖子老板的父類 class FatFather(object):def __init__(self, name, *args, **kwargs):print()print("=============== 開始調用 FatFather ========================")print('FatFather的init開始被調用')self.name = nameprint('調用FatFather類的name是%s' % self.name)print('FatFather的init調用結束')print()print("=============== 結束調用 FatFather ========================")# 胖子老板類 繼承 FatFather 類 class FatBoss(FatFather):def __init__(self, name, hobby, *args, **kwargs):print()print("=============== 開始調用 FatBoss ========================")print('胖子老板的類被調用啦!')super().__init__(name)# 因為多繼承傳遞的參數不一致,所以使用不定參數super().__init__(name, *args, **kwargs)print("%s 的愛好是 %s" % (name, hobby))print()print("=============== 結束調用 FatBoss ========================")# 胖子老板的老婆類 繼承 FatFather類 class FatBossWife(FatFather):def __init__(self, name, housework, *args, **kwargs):print()print("=============== 開始調用 FatBossWife ========================")print('胖子老板的老婆類被調用啦!要學會干家務')super().__init__(name)# 因為多繼承傳遞的參數不一致,所以使用不定參數super().__init__(name, *args, **kwargs)print("%s 需要干的家務是 %s" % (name, housework))print()print("=============== 結束調用 FatBossWife ========================")# 胖子老板的女兒類 繼承 FatBoss FatBossWife類 class FatBossGril(FatBoss, FatBossWife):def __init__(self, name, hobby, housework):print('胖子老板的女兒類被調用啦!要學會干家務,還要會幫胖子老板斗地主')super().__init__(name, hobby, housework)def main(): print("打印FatBossGril類的MRO") print(FatBossGril.__mro__)print() print("=========== 下面按照 MRO 順序執行super方法 =============") gril = FatBossGril("胖子老板", "打斗地主", "拖地")

運行結果如下:

if __name__ == "__main__":main()#打印FatBossGril類的MRO (<class '__main__.FatBossGril'>, <class '__main__.FatBoss'>, <class '__main__.FatBossWife'>, <class '__main__.FatFather'>, <class 'object'>)=========== 下面按照 MRO 順序執行super方法 ============= 胖子老板的女兒類被調用啦!要學會干家務,還要會幫胖子老板斗地主=============== 開始調用 FatBoss ======================== 胖子老板的類被調用啦!=============== 開始調用 FatBossWife ======================== 胖子老板的老婆類被調用啦!要學會干家務=============== 開始調用 FatFather ======================== FatFather的init開始被調用 調用FatFather類的name是胖子老板 FatFather的init調用結束=============== 結束調用 FatFather ======================== 胖子老板 需要干的家務是 拖地=============== 結束調用 FatBossWife ======================== 胖子老板 的愛好是 打斗地主=============== 結束調用 FatBoss ========================

從上面的運行結果來看,我特意給每個類的調用開始以及結束都進行打印標識,可以看到。

每個類開始調用是根據MRO順序進行開始,然后逐個進行結束的。

還有就是由于因為需要繼承不同的父類,參數不一定。

所以,所有的父類都應該加上不定參數*args , **kwargs ,不然參數不對應是會報錯的。

三、注意事項

  • super().__init__相對于類名.__init__,在單繼承上用法基本無差
  • 但在多繼承上有區別,super方法能保證每個父類的方法只會執行一次,而使用類名的方法會導致方法被執行多次,可以嘗試寫個代碼來看輸出結果
  • 多繼承時,使用super方法,對父類的傳參數,應該是由于python中super的算法導致的原因,必須把參數全部傳遞,否則會報錯
  • 單繼承時,使用super方法,則不能全部傳遞,只能傳父類方法所需的參數,否則會報錯
  • 多繼承時,相對于使用類名.__init__方法,要把每個父類全部寫一遍, 而使用super方法,只需寫一句話便執行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因

四、練習

以下的代碼的輸出將是什么? 說出你的答案并解釋。

class Parent(object):x = 1class Child1(Parent):passclass Child2(Parent):passprint(Parent.x, Child1.x, Child2.x)1 1 1Child1.x = 2 print(Parent.x, Child1.x, Child2.x)1 2 1 #注意:Child1已經擁有了屬于自己的xParent.x = 3 print(Parent.x, Child1.x, Child2.x)3 2 3

總結

以上是生活随笔為你收集整理的Python基础教程:super()方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 香港黄色网 | 日韩性xxx| 亚洲天堂手机在线观看 | 手机在线视频一区 | 欧美一区,二区 | 日本高清不卡一区 | 男女视频国产 | 一区二区三区www污污污网站 | 午夜精品久久久久久久无码 | 在线综合色 | 影音先锋国产 | 欧美黄色三级视频 | 亚洲国产精品成人va在线观看 | 涩涩网站在线 | 免费观看91视频 | 国产精品第2页 | 精品在线播放视频 | 逼特逼在线视频 | 天堂av2014| 亚洲AV无码成人精品一区 | 哈利波特3在线观看免费版英文版 | 国产精品美女www | 国产露脸无套对白在线播放 | 亚洲天堂一区二区在线观看 | 天天想你在线观看完整版电影免费 | 亚洲精品欧美日韩 | 在线精品小视频 | 97在线免费观看 | 狠狠干超碰 | 国产综合在线视频 | av成人资源 | 日韩欧洲亚洲 | 好吊视频一区二区 | 黄色片网站在线免费观看 | 国产精品久久久久久久久久久久久 | 99精品视频播放 | 18成人免费观看视频 | 黄色片在线视频 | 极品少妇视频 | 风间由美一区二区三区 | 另类ts人妖一区二区三区 | 色老头在线观看 | 国产三级伦理片 | 久久久久久久极品内射 | 久久精品国产大片免费观看 | 欧美一区二区三区激情 | 尤物在线免费视频 | 99久久精品国产成人一区二区 | 69xx欧美| 国产亚洲成av人在线观看导航 | 国产欧美久久久久 | 国内精品亚洲 | 97人妻精品一区二区 | 国内毛片毛片毛片毛片 | 影音先锋国产 | 精品福利在线视频 | 又大又长粗又爽又黄少妇视频 | 丝袜性爱视频 | 私拍在线| 亚洲一级片免费 | 欧美激情综合网 | 亚洲av男人的天堂在线观看 | av中文字幕一区二区 | 欧美成人国产精品高潮 | 国产一区二区在线免费观看视频 | 国产又粗又猛又爽69xx | 黄页免费视频 | 美女福利视频在线观看 | 三级黄色在线 | 午夜免费一区 | 日韩视频在线免费观看 | 国产极品视频在线观看 | 国产成人在线精品 | 日本久久一级片 | 日本综合在线 | 爱爱色图 | 夜夜嗨av一区二区三区 | 欧美精品自拍 | 狠狠操影视 | 精品成人av一区二区在线播放 | www.97色 | 成人性免费视频 | 精品一区二区久久久 | 天天干狠狠爱 | 日韩在线一级片 | 懂色av一区二区三区四区五区 | 波多野吉衣av在线 | 亚洲久操 | 992tv人人草 国产第6页 | 亚洲国产一二 | 亚洲欧美日韩一区 | 狠狠干免费视频 | 久久精品小视频 | 精精国产xxxx视频在线 | juliaann精品艳妇hd | 台湾佬久久| 欧美日韩一区二区三区在线播放 | 国产黄色高清视频 | 这里只有精品在线播放 |