国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Python編程中對super函數的正確理解和用法解析

來源:懂視網 責編:小采 時間:2020-11-27 14:28:58
文檔

Python編程中對super函數的正確理解和用法解析

Python編程中對super函數的正確理解和用法解析:當在子類需要調用父類的方法時,在python2.2之前,直接用類名調用類的方法,即非綁定的類方法,并把自身對象self作參數傳進去。class A(object): def say(self): print 'I am A' class B(A): def say(self): print
推薦度:
導讀Python編程中對super函數的正確理解和用法解析:當在子類需要調用父類的方法時,在python2.2之前,直接用類名調用類的方法,即非綁定的類方法,并把自身對象self作參數傳進去。class A(object): def say(self): print 'I am A' class B(A): def say(self): print

當在子類需要調用父類的方法時,在python2.2之前,直接用類名調用類的方法,即非綁定的類方法,并把自身對象self作參數傳進去。

class A(object): 
 def say(self): 
 print 'I am A' 
 
class B(A): 
 def say(self): 
 print 'I am B' 
 A.say(self) 
 
b = B() 
b.say()

輸出

I am B
I am A

這樣運作挺好,不過有個問題,當父類改了名字時,就要把這些顯式調用父類的一個個更正,子類和父類耦合比較高。
于是python2.2后就推出了super()函數來避免硬編碼,不用關心父類名叫什么。
使用super()函數,上面的代碼可以寫成如下。

class B(A): 
 def say(self): 
 print 'I am B' 
 super(B,self).say()

python3.0后,又做了改良,super()函數不用傳參數,即上面的那行代碼直接super().say()就行了。

需要注意的問題:

  • super只能用在新式類中。

  • super在多重繼承有問題,如果子類繼承多個父類,那么super調用第一個父類的方法。

  • 不要混用這兩種調用父類方法的方案,要么都用非綁定的類方法,要么都用super。不然可能導致沒被調用或者被調用多次。

  • BUT:
    不要一說到 super 就想到父類!super 指的是 MRO 中的下一個類!
    一說到 super 就想到父類這是初學者很容易犯的一個錯誤,也是我當年犯的錯誤。

    def super(cls, inst):
     mro = inst.__class__.mro()
     return mro[mro.index(cls) + 1]

    兩個參數 cls 和 inst 分別做了兩件事:
    1. inst 負責生成 MRO 的 list
    2. 通過 cls 定位當前 MRO 中的 index, 并返回 mro[index + 1]
    這兩件事才是 super 的實質,一定要記住!
    MRO 全稱 Method Resolution Order,它代表了類繼承的順序。

    舉個例子:

    class Root(object):
     def __init__(self):
     print("this is Root")
    
    class B(Root):
     def __init__(self):
     print("enter B")
     # print(self) # this will printsuper(B, self).__init__()
     print("leave B")
    
    class C(Root):
     def __init__(self):
     print("enter C")
     super(C, self).__init__()
     print("leave C")
    
    class D(B, C):
     pass
    
    d = D()
    print(d.__class__.__mro__)

    輸出

    enter B
    enter C
    this is Root
    leave C
    leave B
    (,,,,)

    知道了 super 和父類其實沒有實質關聯之后,我們就不難理解為什么 enter B 下一句是 enter C 而不是 this is Root(如果認為 super 代表“調用父類的方法”,會想當然的認為下一句應該是this is Root)。流程如下,在 B 的 __init__ 函數中:

    super(B, self).__init__()

    首先,我們獲取 self.__class__.__mro__,注意這里的 self 是 D 的 instance 而不是 B 的

    (

    然后,通過 B 來定位 MRO 中的 index,并找到下一個。顯然 B 的下一個是 C。于是,我們調用 C 的 __init__,打出 enter C。

    順便說一句為什么 B 的 __init__ 會被調用:因為 D 沒有定義 __init__,所以會在 MRO 中找下一個類,去查看它有沒有定義 __init__,也就是去調用 B 的 __init__。

    其實這一切邏輯還是很清晰的,關鍵是理解 super 到底做了什么。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Python編程中對super函數的正確理解和用法解析

    Python編程中對super函數的正確理解和用法解析:當在子類需要調用父類的方法時,在python2.2之前,直接用類名調用類的方法,即非綁定的類方法,并把自身對象self作參數傳進去。class A(object): def say(self): print 'I am A' class B(A): def say(self): print
    推薦度:
    標簽: 函數 python pyth
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产日本在线视频 | 日韩欧美亚洲 | 人人干人人爽 | 欧美日韩国产一区二区三区不卡 | 国产欧美又粗又猛又爽老 | 亚洲国产成人久久综合碰 | 国产一区二区三区日韩欧美 | 国产一级久久久久久毛片 | 国产精品免费_区二区三区观看 | 久久伊人中文字幕 | 亚洲成a人一区二区三区 | 久久国产精品久久精 | 免费国产va在线观看视频 | 国产91系列 | 日韩欧美大陆 | 男女全黄一级带免费 | 精品欧美一区二区三区在线观看 | 国产成人精品日本亚洲语音1 | 性夜影院爽黄a爽免费看网站 | 久久久精品久久久久久久久久久 | 国产精品 日韩 | 国产九九精品 | 欧美高清一区二区 | 欧美精品专区免费观看 | 国产精品观看 | 免费黄a | 中文字幕日本一本二本三区 | 亚洲第一视频网站 | 国产精品久久久久久久久久久久 | 日韩 亚洲 制服 欧美 综合 | 国产激情一区二区三区成人91 | 国产日韩欧美精品一区二区三区 | 久久免费精品国产72精品剧情 | 欧美国产成人精品一区二区三区 | 欧美日韩第一页 | 欧美日本国产 | 精品久久亚洲一级α | 国产亚洲美女精品久久久2020 | 国产一区二区三区在线 | 真实的和子乱拍在线观看 | 欧美在线 | 亚洲 |