国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python中super()方法的詳細用法

這篇具有很好參考價值的文章主要介紹了python中super()方法的詳細用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、單獨調(diào)用父類的方法

需求:編寫一個類,然后再寫一個子類進行繼承,使用子類去調(diào)用父類的方法1。
使用方法1打印: 胖子老板,來包檳榔。

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

class FatFather(object):
    def __init__(self, name):
        print('FatFather的init開始被調(diào)用')
        self.name = name
        print('FatFather的name是%s' % self.name)
        print('FatFather的init調(diào)用結(jié)束')


def main():
    ff = FatFather("胖子老板的父親")

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

if __name__ == "__main__":
    main()

#FatFather的init開始被調(diào)用
#FatFather的name是胖子老板的父親
#FatFather的init調(diào)用結(jié)束

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

# 胖子老板的父類
class FatFather(object):
    def __init__(self, name):
        print('FatFather的init開始被調(diào)用')
        self.name = name
        print('調(diào)用FatFather類的name是%s' % self.name)
        print('FatFather的init調(diào)用結(jié)束')


# 胖子老板類 繼承 FatFather 類
class FatBoss(FatFather):
    def __init__(self, name, hobby):
        print('胖子老板的類被調(diào)用啦!')
        self.hobby = hobby
        FatFather.__init__(self, name)  # 直接調(diào)用父類的構(gòu)造方法
        print("%s 的愛好是 %s" % (name, self.hobby))


def main():
    #ff = FatFather("胖子老板的父親")
    fatboss = FatBoss("胖子老板", "打斗地主")

在這上面的代碼中,我使用FatFather.init(self,name)直接調(diào)用父類的方法。

運行結(jié)果如下:

if __name__ == "__main__":
    main()

#胖子老板的類被調(diào)用啦!
#FatFather的init開始被調(diào)用
#調(diào)用FatFather類的name是胖子老板
#FatFather的init調(diào)用結(jié)束
#胖子老板 的愛好是 打斗地主

二、super() 方法基本概念

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

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

1 描述

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

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

2 語法

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

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

參數(shù)

  • type – 類

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

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

Python3.x 實例:

class A:
    pass
class B(A):
    def add(self, x):
        super().add(x)
3 單繼承使用super()

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

# 胖子老板的父類
class FatFather(object):
    def __init__(self, name):
        print('FatFather的init開始被調(diào)用')
        self.name = name
        print('調(diào)用FatFather類的name是%s' % self.name)
        print('FatFather的init調(diào)用結(jié)束')


# 胖子老板類 繼承 FatFather 類
class FatBoss(FatFather):
    def __init__(self, name, hobby):
        print('胖子老板的類被調(diào)用啦!')
        self.hobby = hobby
        #FatFather.__init__(self,name)   # 直接調(diào)用父類的構(gòu)造方法
        super().__init__(name)
        print("%s 的愛好是 %s" % (name, self.hobby))


def main():
    #ff = FatFather("胖子老板的父親")
    fatboss = FatBoss("胖子老板", "打斗地主")

從上面使用super方法的時候,因為是單繼承,直接就可以使用了。

運行如下:

if __name__ == "__main__":
    main()

#胖子老板的類被調(diào)用啦!
#FatFather的init開始被調(diào)用
#調(diào)用FatFather類的name是胖子老板
#FatFather的init調(diào)用結(jié)束
#胖子老板 的愛好是 打斗地主

那么為什么說單繼承直接使用就可以呢?因為super()方法如果多繼承的話,會涉及到一個MRO(繼承父類方法時的順序表) 的調(diào)用排序問題。

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

# 胖子老板的父類
class FatFather(object):
    def __init__(self, name):
        print('FatFather的init開始被調(diào)用')
        self.name = name
        print('調(diào)用FatFather類的name是%s' % self.name)
        print('FatFather的init調(diào)用結(jié)束')


# 胖子老板類 繼承 FatFather 類
class FatBoss(FatFather):
    def __init__(self, name, hobby):
        print('胖子老板的類被調(diào)用啦!')
        self.hobby = hobby
        #FatFather.__init__(self,name)   # 直接調(diào)用父類的構(gòu)造方法
        super().__init__(name)
        print("%s 的愛好是 %s" % (name, self.hobby))


def main():

    print("打印FatBoss類的MRO")
    print(FatBoss.__mro__)

    print()
    print("=========== 下面按照 MRO 順序執(zhí)行super方法 =============")
    fatboss = FatBoss("胖子老板", "打斗地主")

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

運行如下:

if __name__ == "__main__":
    main()

打印FatBoss類的MRO
(<class '__main__.FatBoss'>, <class '__main__.FatFather'>, <class 'object'>)

=========== 下面按照 MRO 順序執(zhí)行super方法 =============
胖子老板的類被調(diào)用啦!
FatFather的init開始被調(diào)用
調(diào)用FatFather類的name是胖子老板
FatFather的init調(diào)用結(jié)束
胖子老板 的愛好是 打斗地主

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

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

4 多繼承使用super()

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

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

此時女兒就是需要繼承使用這兩個父類的方法了,那么該如何去寫呢?
下面來看看實現(xiàn)代碼:

# 胖子老板的父類
class FatFather(object):
    def __init__(self, name, *args, **kwargs):
        print()
        print("=============== 開始調(diào)用 FatFather  ==================")
        print('FatFather的init開始被調(diào)用')
        self.name = name
        print('調(diào)用FatFather類的name是%s' % self.name)
        print('FatFather的init調(diào)用結(jié)束')
        print()
        print("=============== 結(jié)束調(diào)用 FatFather  ==================")


# 胖子老板類 繼承 FatFather 類
class FatBoss(FatFather):
    def __init__(self, name, hobby, *args, **kwargs):
        print()
        print("=============== 開始調(diào)用 FatBoss  ==================")
        print('胖子老板的類被調(diào)用啦!')
        #super().__init__(name)
        ## 因為多繼承傳遞的參數(shù)不一致,所以使用不定參數(shù)
        super().__init__(name, *args, **kwargs)
        print("%s 的愛好是 %s" % (name, hobby))
        print()
        print("=============== 結(jié)束調(diào)用 FatBoss  =================")

#學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流群:711312441
# 胖子老板的老婆類 繼承 FatFather類
class FatBossWife(FatFather):
    def __init__(self, name, housework, *args, **kwargs):
        print()
        print("=============== 開始調(diào)用 FatBossWife  ===============")
        print('胖子老板的老婆類被調(diào)用啦!要學(xué)會干家務(wù)')
        #super().__init__(name)
        ## 因為多繼承傳遞的參數(shù)不一致,所以使用不定參數(shù)
        super().__init__(name, *args, **kwargs)
        print("%s 需要干的家務(wù)是 %s" % (name, housework))
        print()
        print("=============== 結(jié)束調(diào)用 FatBossWife  ==============")


# 胖子老板的女兒類 繼承 FatBoss FatBossWife類
class FatBossGril(FatBoss, FatBossWife):
    def __init__(self, name, hobby, housework):
        print('胖子老板的女兒類被調(diào)用啦!要學(xué)會干家務(wù),還要會幫胖子老板斗地主')
        super().__init__(name, hobby, housework)


def main():

    print("打印FatBossGril類的MRO")
    print(FatBossGril.__mro__)

    print()
    print("=========== 下面按照 MRO 順序執(zhí)行super方法 ===========")
    gril = FatBossGril("胖子老板", "打斗地主", "拖地")

運行結(jié)果如下:

if __name__ == "__main__":
    main()
打印FatBossGril類的MRO

(<class '__main__.FatBossGril'>, <class '__main__.FatBoss'>, 
<class '__main__.FatBossWife'>, <class '__main__.FatFather'>, <class 'object'>)

=========== 下面按照 MRO 順序執(zhí)行super方法 =============
胖子老板的女兒類被調(diào)用啦!要學(xué)會干家務(wù),還要會幫胖子老板斗地主

=============== 開始調(diào)用 FatBoss  ======================
胖子老板的類被調(diào)用啦!

=============== 開始調(diào)用 FatBossWife  ==================
胖子老板的老婆類被調(diào)用啦!要學(xué)會干家務(wù)

=============== 開始調(diào)用 FatFather  ====================
FatFather的init開始被調(diào)用
調(diào)用FatFather類的name是胖子老板
FatFather的init調(diào)用結(jié)束

=============== 結(jié)束調(diào)用 FatFather  ===================
胖子老板 需要干的家務(wù)是 拖地

=============== 結(jié)束調(diào)用 FatBossWife  =================
胖子老板 的愛好是 打斗地主

=============== 結(jié)束調(diào)用 FatBoss  ======================

從上面的運行結(jié)果來看,我特意給每個類的調(diào)用開始以及結(jié)束都進行打印標(biāo)識,可以看到。每個類開始調(diào)用是根據(jù)MRO順序進行開始,然后逐個進行結(jié)束的。還有就是由于因為需要繼承不同的父類,參數(shù)不一定。所以,所有的父類都應(yīng)該加上不定參數(shù)*args , **kwargs ,不然參數(shù)不對應(yīng)是會報錯的。

三、注意事項

  • super().__init__相對于類名.init,在單繼承上用法基本無差

  • 但在多繼承上有區(qū)別,super方法能保證每個父類的方法只會執(zhí)行一次,而使用類名的方法會導(dǎo)致方法被執(zhí)行多次,可以嘗試寫個代碼來看輸出結(jié)果

  • 多繼承時,使用super方法,對父類的傳參數(shù),應(yīng)該是由于python中super的算法導(dǎo)致的原因,必須把參數(shù)全部傳遞,否則會報錯

  • 單繼承時,使用super方法,則不能全部傳遞,只能傳父類方法所需的參數(shù),否則會報錯

  • 多繼承時,相對于使用類名.__init__方法,要把每個父類全部寫一遍, 而使用super方法,只需寫一句話便執(zhí)行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因文章來源地址http://www.zghlxwxcb.cn/news/detail-754040.html

到了這里,關(guān)于python中super()方法的詳細用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python中的super:調(diào)用父類的構(gòu)造方法

    Python中的super:調(diào)用父類的構(gòu)造方法

    ?在子類構(gòu)造方法中調(diào)用父類構(gòu)造方法的兩種方式: 1、未綁定的方法: 直接使用父類名來進行調(diào)用 ,即‘父類名.父類方法名(self,[參數(shù)1, 參數(shù)2,...])’ 2、 super() : 如果涉及多繼承,該函數(shù)只能調(diào)用第一個直接父類的構(gòu)造方法。super().父類方法名(self, [參數(shù)1, 參數(shù)2,...])或supe

    2024年02月15日
    瀏覽(22)
  • python調(diào)用父類方法的三種方式(super調(diào)用和父類名調(diào)用)

    父類名.方法名(self) super(子類名,self).父類方法名() super().父類方法名 注意:super()通過子類調(diào)用當(dāng)前父類的方法,super默認會調(diào)用第一個父類的方法(適用于單繼承的多層繼承 如下代碼: 如下代碼: 上面代碼運行結(jié)果: 針對這種情況,正確的做法是定義Person類自己的構(gòu)造方法

    2024年02月06日
    瀏覽(21)
  • 【Python beautifulsoup】詳細介紹beautifulsoup庫的使用方法,包括安裝方式、基本用法、常用方法和技巧,以及結(jié)合lxml和parsel的具體使用場景和區(qū)別。

    【Python beautifulsoup】詳細介紹beautifulsoup庫的使用方法,包括安裝方式、基本用法、常用方法和技巧,以及結(jié)合lxml和parsel的具體使用場景和區(qū)別。

    Python beautifulsoup庫是一個強大的Web抓取和解析庫,它提供了豐富的功能和簡單易用的API,可以幫助我們處理HTML和XML文檔,從中提取數(shù)據(jù),進行數(shù)據(jù)清洗和處理。beautifulsoup庫基于Python標(biāo)準(zhǔn)庫中的html.parser模塊,同時還可以與第三方解析庫lxml和parsel配合使用,提供更高效和靈活的

    2024年02月04日
    瀏覽(53)
  • C語言中fopen的詳細用法

    fopen是C語言中用于打開文件的函數(shù),其原型為: 其中,filename是要打開的文件名,mode是打開文件的模式。fopen函數(shù)返回一個指向FILE類型的指針,該指針指向打開的文件。 fopen函數(shù)的mode參數(shù)有以下幾種: \\\"r\\\":以只讀方式打開文件。文件必須存在,否則打開失敗。 \\\"w\\\":以寫方式

    2024年02月11日
    瀏覽(4)
  • 【ES6】js 中class的extends、super關(guān)鍵字用法和避坑點

    在JavaScript中,使用class可以實現(xiàn)面向?qū)ο缶幊?。其中,extends和super是兩個非常重要的,它們分別用于實現(xiàn)類的繼承和調(diào)用父類的方法。 一、extends extends用于實現(xiàn)類的繼承,它可以讓一個子類繼承父類的屬性和方法。使用extends時,需要指定要

    2024年02月09日
    瀏覽(23)
  • C語言中的static的用法(超級詳細)

    C語言中的static的用法(超級詳細)

    ??作者:云小逸 ??個人主頁:[云小逸的主頁] ??碼云:云小逸 (YunXiaoYi003) ??motto:要敢于一個人默默的面對自己,強大自己才是核心。不要等到什么都沒有了,才下定決心去做。種一顆樹,最好的時間是十年前,其次就是現(xiàn)在!學(xué)會自己和解,與過去和解,努力愛自己。希望

    2024年01月16日
    瀏覽(21)
  • 手把手QQ機器人制作教程,根據(jù)官方接口進行開發(fā),基于Python語言制作的詳細教程(更新中)

    手把手QQ機器人制作教程,根據(jù)官方接口進行開發(fā),基于Python語言制作的詳細教程(更新中)

    QQ開放平臺官方地址:https://q.qq.com/#/app/bot QQ開放平臺包含:QQ機器人、QQ小程序、QQ小游戲,我們這邊選擇QQ機器人。 機器人類型:設(shè)置私域機器人或者公域機器人,當(dāng)然公域機器人對于服務(wù)器的要求過高,我們這邊選擇 私域機器人 進行開發(fā)。 特別注意在選擇沙箱頻道的時候

    2023年04月08日
    瀏覽(28)
  • 【C語言】深入解密C語言組包與解包的用法、應(yīng)用以及const的詳細解說

    【C語言】深入解密C語言組包與解包的用法、應(yīng)用以及const的詳細解說

    目錄 一、sprintf 用于組包 ?應(yīng)用1:按照規(guī)定格式組包 ?應(yīng)用2:將數(shù)值類型轉(zhuǎn)換成字符串類型? 二、sscanf 用于解包 ?應(yīng)用1:%d提取數(shù)值‘0’~‘9’ ??應(yīng)用2:%s提取字符串(遇到\\\'\\0\\\' 空格 回車結(jié)束提取) ?三、sscanf高級應(yīng)用 1、跳過數(shù)據(jù)%*d %*s(*表示跳過該數(shù)據(jù)) 2、讀取指定寬

    2024年02月16日
    瀏覽(42)
  • 瀏覽器開發(fā)者工具network用法,超詳細講解

    瀏覽器開發(fā)者工具network用法,超詳細講解

    最近很多小伙伴說,不會用瀏覽器開發(fā)者工具,今天我們就一起來深入了解一下開發(fā)者工具。 以谷歌瀏覽器為例 谷歌瀏覽器開發(fā)者工具中的Network 是我們學(xué)習(xí)經(jīng)常用到的,那么你都知道他們每個功能的意義嗎? 因本人經(jīng)常有360極速瀏覽器,谷歌內(nèi)核,所以本文以360極速瀏覽器的

    2024年02月08日
    瀏覽(22)
  • Python的切片操作詳細用法解析

    Python的切片操作詳細用法解析

    在利用Python解決各種實際問題的過程中,經(jīng)常會遇到從某個對象中抽取部分值的情況,切片操作正是專門用于完成這一操作的有力武器。理論上而言,只要條件表達式得當(dāng),可以通過單次或多次切片操作實現(xiàn)任意切取目標(biāo)值。切片操作的基本語法比較簡單,但如果不徹底搞清

    2024年02月02日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包