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

Python中super()函數(shù)簡介及用法分享

 更新時間:2016年07月11日 08:49:48   投稿:hebedich  
本文給大家分享的是Python中的super函數(shù)的簡單介紹以及用法和注意事項(xiàng),有需要的小伙伴可以參考下

首先看一下super()函數(shù)的定義:

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

Return a **proxy object** that delegates method calls to a **parent or sibling** class of type.

返回一個代理對象, 這個對象負(fù)責(zé)將方法調(diào)用分配給第一個參數(shù)的一個父類或者同輩的類去完成.

parent or sibling class 如何確定?

第一個參數(shù)的__mro__屬性決定了搜索的順序, super指的的是 MRO(Method Resolution Order) 中的下一個類, 而不一定是父類!

super()和getattr() 都使用__mro__屬性來解析搜索順序, __mro__實(shí)際上是一個只讀的元組.

MRO中類的順序是怎么排的呢?

實(shí)際上MRO列表本身是根據(jù)一種C3的線性化處理技術(shù)確定的, 理論說明可以參考這里, 這里只簡單說明一下原則:

在MRO中, 基類永遠(yuǎn)出現(xiàn)在派生類的后面, 如果有多個基類, 基類的相對順序不變.

MRO實(shí)際上是對繼承樹做層序遍歷的結(jié)果, 把一棵帶有結(jié)構(gòu)的樹變成了一個線性的表, 所以沿著這個列表一直往上, 就可以無重復(fù)的遍歷完整棵樹, 也就解決了多繼承中的Diamond問題.

比如說:

class Root:
  pass

class A(Root):
  pass

class B(Root):
  pass

class C(A, B):
  pass

print(C.__mro__)

# 輸出結(jié)果為:
# (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Root'>, <class 'object'>)

super()實(shí)際返回的是一個代理的super對象!

調(diào)用super()這個構(gòu)造方法時, 只是返回一個super()對象, 并不做其他的操作.

然后對這個super對象進(jìn)行方法調(diào)用時, 發(fā)生的事情如下:

找到第一個參數(shù)的__mro__列表中的下一個直接定義了該方法的類, 并實(shí)例化出一個對象
然后將這個對象的self變量綁定到第二個參數(shù)上, 返回這個對象

舉個例子:

class Root:
  def __init__(self):
    print('Root')

class A(Root):
  def __init__(self):
    super().__init__() # 等同于super(A, self).__init__()

在A的構(gòu)造方法中, 先調(diào)用super()得到一個super對象, 然后向這個對象調(diào)用init方法, 這是super對象會搜索A的__mro__列表, 找到第一個定義了__init__方法的類, 于是就找到了Root, 然后調(diào)用Root.__init__(self), 這里的self是super()的第二個參數(shù), 是編譯器自動填充的, 也就是A的__init__的第一個參數(shù), 這樣就完成對__init__方法調(diào)用的分配.

注意: 在許多語言的繼承中, 子類必須調(diào)用父類的構(gòu)造方法, 就是為了保證子類的對象能夠填充上父類的屬性! 而不是初始化一個父類對象...(我之前就一直是這么理解的..). Python中就好多了, 所謂的調(diào)用父類構(gòu)造方法, 就是明明白白地把self傳給父類的構(gòu)造方法, 我的小身子骨就這么交給你了, 隨便你怎么折騰吧:joy:

參數(shù)說明

super() -> same as super(__class__, <first argument>) # <first argument>指的是調(diào)用super的函數(shù)的第一個參數(shù)
super(type) -> unbound super object
super(type, obj) -> bound super object; requires isinstance(obj, type)
super(type, type2) -> bound super object; requires issubclass(type2, type)

 Typical use to call a cooperative superclass method:
  class C(B):
    def meth(self, arg):
      super().meth(arg)
  This works for class methods too:
  class C(B):
    @classmethod
    def cmeth(cls, arg):
      super().cmeth(arg)

如果提供了第二個參數(shù), 則找到的父類對象的self就綁定到這個參數(shù)上, 后面調(diào)用這個對象的方法時, 可以自動地隱式傳遞self.
如果第二個參數(shù)是一個對象, 則isinstance(obj, type)必須為True. 如果第二個參數(shù)為一個類型, 則issubclass(type2, type)必須為True

如果沒有傳遞第二個參數(shù), 那么返回的對象就是Unbound, 調(diào)用這個unbound對象的方法時需要手動傳遞第一個參數(shù), 類似于Base.__int__(self, a, b).

不帶參數(shù)的super()只能用在類定義中(因?yàn)橐蕾囉赾aller的第二個參數(shù)), 編譯器會自動根據(jù)當(dāng)前定義的類填充參數(shù).
也就是說, 后面所有調(diào)用super返回對象的方法時, 第一個參數(shù)self都是super()的第二個參數(shù). 因?yàn)镻ython中所謂的方法, 就是一個第一個參數(shù)為self的函數(shù), 一般在調(diào)用方法的時候a.b()會隱式的將a賦給b()的第一個參數(shù).

super()的兩種常見用法:

單繼承中, super用來指代隱式指代父類, 避免直接使用父類的名字
多繼承中, 解決Diamond問題 (TODO)

對面向?qū)ο蟮睦斫?/p>

其實(shí)我覺得Python里面這樣的語法更容易理解面向?qū)ο蟮谋举|(zhì), 比Java中隱式地傳this更容易理解.

所謂函數(shù), 就是一段代碼, 接受輸入, 返回輸出. 所謂方法, 就是一個函數(shù)有了一個隱式傳遞的參數(shù). 所以方法就是一段代碼, 是類的所有實(shí)例共享的, 唯一不同的是各個實(shí)例調(diào)用的時候傳給方法的this 或者self不一樣而已.

構(gòu)造方法是什么呢? 其實(shí)也是一個實(shí)例方法啊, 它只有在對象生成了之后才能調(diào)用, 所以Python中__init__方法的參數(shù)是self啊. 調(diào)用構(gòu)造方法時其實(shí)已經(jīng)為對象分配了內(nèi)存, 構(gòu)造方法只是起到初始化的作用, 也就是為這段內(nèi)存里面賦點(diǎn)初值而已.

Java中所謂的靜態(tài)變量其實(shí)也就是類的變量, 其實(shí)也就是為類也分配了內(nèi)存, 里面存了這些變量, 所以Python中的類對象我覺得是很合理的, 也比Java要直觀. 至于靜態(tài)方法, 那就與對象一點(diǎn)關(guān)系都沒有了, 本質(zhì)就是個獨(dú)立的函數(shù), 只不過寫在了類里面而已. 而Python中的classmethod其實(shí)也是一種靜態(tài)方法, 不過它會依賴于cls對象, 這個cls就是類對象, 但是只要想用這個方法, 類對象必然是存在的, 不像實(shí)例對象一樣需要手動的實(shí)例化, 所以classmethod也可以看做是一種靜態(tài)變量. 而staticmethod就是真正的靜態(tài)方法了, 是獨(dú)立的函數(shù), 不依賴任何對象.

Java中的實(shí)例方法是必須依賴于對象存在的, 因?yàn)橐[式的傳輸this, 如果對象不存在這個this也沒法隱式了. 所以在靜態(tài)方法中是沒有this指針的, 也就沒法調(diào)用實(shí)例方法. 而Python中的實(shí)例方法是可以通過類名來調(diào)用的, 只不過因?yàn)檫@時候self沒辦法隱式傳遞, 所以必須得顯式地傳遞.

相關(guān)文章

  • python3獲取控制臺輸入的數(shù)據(jù)的具體實(shí)例

    python3獲取控制臺輸入的數(shù)據(jù)的具體實(shí)例

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python3獲取控制臺輸入的數(shù)據(jù)的具體實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-08-08
  • 20行python代碼實(shí)現(xiàn)人臉識別

    20行python代碼實(shí)現(xiàn)人臉識別

    這篇文章主要介紹了python人臉識別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python計(jì)算RPKM操作示例詳解

    python計(jì)算RPKM操作示例詳解

    這篇文章主要為大家介紹了python計(jì)算RPKM操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Python中裝飾器學(xué)習(xí)總結(jié)

    Python中裝飾器學(xué)習(xí)總結(jié)

    這篇文章主要介紹了Python中裝飾器學(xué)習(xí)總結(jié),分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • termux中matplotlib無法顯示中文問題的解決方法

    termux中matplotlib無法顯示中文問題的解決方法

    這篇文章主要介紹了termux中matplotlib無法顯示中文問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python基礎(chǔ)教程之while循環(huán)用法講解

    Python基礎(chǔ)教程之while循環(huán)用法講解

    Python中除了for循環(huán)之外還有一個while循環(huán),下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之while循環(huán)用法講解的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 用Python3通過PyCharm上傳代碼到Git服務(wù)器的詳細(xì)過程

    用Python3通過PyCharm上傳代碼到Git服務(wù)器的詳細(xì)過程

    上傳代碼到服務(wù)器,如果不知道的情況下還用傳統(tǒng)的方式上傳很麻煩,現(xiàn)在很多IDE都提供上傳代碼的功能,例如:VSCode,PyCharm等等,本文講解的是PyCharm,需要的朋友可以參考下
    2024-03-03
  • 使用Filter過濾python中的日志輸出的實(shí)現(xiàn)方法

    使用Filter過濾python中的日志輸出的實(shí)現(xiàn)方法

    這篇文章主要介紹了使用Filter過濾python中的日志輸出,本文給大家分享幾種方法,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 使用Python中的線程進(jìn)行網(wǎng)絡(luò)編程的入門教程

    使用Python中的線程進(jìn)行網(wǎng)絡(luò)編程的入門教程

    這篇文章主要介紹了使用Python中的線程進(jìn)行網(wǎng)絡(luò)編程的入門教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • 教你利用pygame模塊制作跳躍小球小游戲

    教你利用pygame模塊制作跳躍小球小游戲

    pygame是一個專門設(shè)計(jì)來進(jìn)行游戲開發(fā)設(shè)計(jì)的Python模塊,因?yàn)閿[脫了被低級語言(如機(jī)器語言和匯編語言)的束縛,使用起來非常的簡單,這篇文章主要給大家介紹了關(guān)于如何利用pygame模塊制作跳躍小球小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評論

济阳县| 乐山市| 和田县| 铁力市| 沈丘县| 内黄县| 昭觉县| 凯里市| 隆子县| 柞水县| 江源县| 平定县| 镇坪县| 陇川县| 开封市| 安多县| 灌南县| 达日县| 永城市| 滕州市| 昌图县| 内江市| 敖汉旗| 威海市| 湖北省| 新巴尔虎右旗| 延川县| 阳原县| 中卫市| 芦山县| 定远县| 吉安县| 叙永县| 沧源| 桂林市| 通州区| 巴马| 罗甸县| 绿春县| 芦山县| 武汉市|