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

Python類的繼承super相關原理解析

 更新時間:2020年10月22日 10:34:16   作者:MR_kdcon  
這篇文章主要介紹了Python類的繼承super相關原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

看了網(wǎng)上許多關于super、mro、C3的介紹感覺沒有一份很容易初學者理解的文檔,直接看C3算法的話,比較難理解,也沒必要,如果掌握一套規(guī)律的話,會輕松許多。我將網(wǎng)上這些博主的文章進行一個梳理總結(jié),最后形成一套實用的關于super、mro、C3的理解介紹。

1、super

super()是一種將子類與父類聯(lián)系起來的一種方法,子類通過繼承父類,可以使用父類的方法和屬性,也可以自己定義屬于自己的方法和屬性。super方法主要用在多繼承中,在單繼承時直接調(diào)用父類方法即可

下面這個是SGD源碼的一部分,根據(jù)這份源碼,

class SGD(Optimizer):
  def __init__(self, params, lr=required, momentum=0, dampening=0,
         weight_decay=0, nesterov=False):
    defaults = dict(lr=lr, momentum=momentum, dampening=dampening,
            weight_decay=weight_decay, nesterov=nesterov)
    if nesterov and (momentum <= 0 or dampening != 0):
      raise ValueError("Nesterov momentum requires a momentum and zero dampening")
    super(SGD, self).__init__(params, defaults)
  def __setstate__(self, state):
    super(SGD, self).__setstate__(state)
    for group in self.param_groups:
      group.setdefault('nesterov', False)

這是SGD類中的代碼

有2點需要補充說明:

1、super聯(lián)系父類的時候,需要調(diào)用父類的方法,包括所帶的形參寫完整,子類不夠的形參需要額外加上

2、super聯(lián)系父類的時候,不只是可以調(diào)用__init__,而且還可以調(diào)用父類其他的方法

3、python3可以寫成super().__init__()這種寫法了。

4、類都默認繼承object類

另外,在super的使用過程中,還需要注意初始化對繼承的影響:

1、子類繼承父類,但不執(zhí)行__init__方法,那么會自動繼承父類屬性。

2、子類繼承父類,執(zhí)行了__init__方法,且不調(diào)用super初始化父類構(gòu)造函數(shù),那么子類不會自動繼承父類屬性。

3、子類繼承父類,執(zhí)行了__init__方法,且調(diào)用了super初始化了父類的構(gòu)造函數(shù),那么子類會繼承父類屬性。

2、mro

Python的MRO,方法解析順序,即在調(diào)用方法時,會對當前類以及所有的基類進行一個搜索,以確定該方法之所在,而這個搜索的順序就是MRO。然后python會按照這個順序去執(zhí)行類之間的調(diào)用問題。

直接上例子

class A1():
  def __init__(self):
    print('A1')
    super().__init__()
class A2():
  def __init__(self):
    print('A2')
    super().__init__()
class A3():
  def __init__(self):
    print('A3')
    super().__init__()
class B1(A1, A2):
  def __init__(self):
    print('B1')
    super().__init__()
class B2(A2):
  def __init__(self):
    print('B2')
    super().__init__()
class B3(A2, A3):
  def __init__(self):
    print('B3')
    super().__init__()
class C1(B1):
  def __init__(self):
    print('C1')
    super().__init__()
class C2(B1, B2):
  def __init__(self):
    print('C2')
    super().__init__()
class C3(B2, B3):
  def __init__(self):
    print('C3')
    super().__init__()
class D(C1, C2, C3):
  def __init__(self):
    print('D')
    super().__init__()
d = D()
print(D.__mro__)

輸出如下:

(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.C3'>, <class '__main__.B2'>, <class '__main__.B3'>, <class '__main__.A2'>, <class '__main__.A3'>, <class 'object'>)

那么這個程序是按怎么個順序依次去執(zhí)行那些方法呢,就是按照MRO中的順序。

那么這個順序如何自己手寫出來呢?這就是C3算法,用于計算出MRO,得出執(zhí)行順序

3、c3算法

但是我在這里想告訴大家如何根據(jù)C3算法找出規(guī)律,從而自己寫出順序

還是上手例子,根據(jù)上面這個圖,我們可以列出下面這個表,這個表示網(wǎng)上一個博主做的,可以說做出這張表就是做出了答案,那這張表“實際取出的類”怎么推出來的呢?我拿過來提煉出一些比較直接的規(guī)律

規(guī)律1:預查找父類按左邊優(yōu)先原則,比如第一行,當前類D的預查找父類選最左邊的C1,而不是C2、C3。

規(guī)律2:當“預查找父類是否還有其他子類?同時又是最底層查找類的父類或父父類、父父父...類”沒有的時候,直接選取預查找父類作為答案。當這項有類的時候,若“最底層的未查找父類”還有,則優(yōu)先選它,若沒有了,則選取這項類作為答案。

規(guī)律3:當預查找父類是object,只要最底層的未查找父類還有,就選這個最底層的未查找父類。若沒有,則“預查找父類是否還有其他子類?同時又是最底層查找類的父類或父父類、父父父...類”有類的時候,就選這個類,沒有的話,答案就是object

另外,

如何去畫圖:

1、子類永遠畫在父類的下面,并用有向箭頭指向父類

2、遇到多繼承則按代碼中繼承列表的順序從左往右寫。如果有多個子類繼承了同一個父類,那么這個父類則放在它能夠出現(xiàn)的所有位置中最左的位置。需遵循圖里面的廣度優(yōu)先原則進行遍歷(在廣度優(yōu)先原則的前提下又優(yōu)先遍歷左邊的):

練習:

下面這個是網(wǎng)上的一份代碼,看懂上面的規(guī)律以及如何畫有向圖之后,就可以順利得出MRO的值了

class A:
  def __init__(self):
    print('A')
    
class B(A):
  def __init__(self):
    print('B')
    super().__init__()

class C(A):
  def __init__(self):
    print('C')
    super().__init__()

class D(A):
  def __init__(self):
    print('D')
    super().__init__()
    
class E(B, C):
  def __init__(self):
    print('E')
    super().__init__()


class F(C, D):
  def __init__(self):
    print('F')
    super().__init__()

class G(E, F):
  def __init__(self):
    print('G')
    super().__init__()

首先,畫圖

然后列表

當前類最底層未查找的父類預查找的父類預查找父類是否為object預查找父類是否有其他子類,同時又是最底層查找類的父類、父父類實際取出的類GE、FEnonoEEFBnonoBBFAno有,CFFnoCnonoCCnoAno有,DDDnoAnonoAAnoobjectyesnoobject

答案:

mro:GEBFC

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 詳解anaconda安裝步驟

    詳解anaconda安裝步驟

    這篇文章主要介紹了詳解anaconda安裝步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Pytorch轉(zhuǎn)tflite方式

    Pytorch轉(zhuǎn)tflite方式

    這篇文章主要介紹了Pytorch轉(zhuǎn)tflite方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 使用Python實現(xiàn)生命之輪Wheel of life效果

    使用Python實現(xiàn)生命之輪Wheel of life效果

    生命之輪Wheel of life這一概念最初由 Success Motivation? Institute, Inc. 的創(chuàng)始人 Paul J. Meyer 提出,生命之輪使人能夠根據(jù)此刻的價值觀、愿景和優(yōu)先事項,本文將使用Python實現(xiàn)生命倒計時圖表,感興趣的可以了解下
    2024-12-12
  • python模擬TLS指紋實現(xiàn)反爬取

    python模擬TLS指紋實現(xiàn)反爬取

    這篇文章主要為大家詳細介紹了如何利用python模擬TLS指紋實現(xiàn)反爬取,文中的示例代碼講解詳細,具有一定的參考價值,有需要的小伙伴可以了解一下
    2023-10-10
  • python沒有gpu,如何改用cpu跑代碼

    python沒有gpu,如何改用cpu跑代碼

    這篇文章主要介紹了python沒有gpu,如何改用cpu跑代碼?今天小編就為大家分享一下解決方案。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python單元測試實例詳解

    Python單元測試實例詳解

    這篇文章主要介紹了Python單元測試,結(jié)合實例形式詳細分析了Python單元測試模塊的功能、使用方法及相關操作注意事項,需要的朋友可以參考下
    2018-05-05
  • Python基于opencv的簡單圖像輪廓形狀識別(全網(wǎng)最簡單最少代碼)

    Python基于opencv的簡單圖像輪廓形狀識別(全網(wǎng)最簡單最少代碼)

    這篇文章主要介紹了基于opencv的簡單圖像輪廓形狀識別(全網(wǎng)最簡單最少代碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Python實現(xiàn)手繪圖效果實例分享

    Python實現(xiàn)手繪圖效果實例分享

    在本篇文章里小編給大家整理了關于Python實現(xiàn)手繪圖效果,有需要的朋友們可以學習下。
    2020-07-07
  • PyQt5每天必學之帶有標簽的復選框

    PyQt5每天必學之帶有標簽的復選框

    這篇文章主要為大家詳細介紹了PyQt5每天必學之復選框的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python字符串不可變數(shù)據(jù)類型

    python字符串不可變數(shù)據(jù)類型

    這篇文章主要介紹了python字符串不可變數(shù)據(jù)類型,下文關于python字符串不可變數(shù)據(jù)類型相關資料展開的內(nèi)容主要有查找子串及數(shù)量、字符串的替換、分割以及合并、刪除側(cè)邊的空白等內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02

最新評論

乌什县| 隆安县| 宣汉县| 巴中市| 开阳县| 平凉市| 台东市| 普格县| 安义县| 西乌| 定安县| 沁阳市| 江阴市| 江口县| 平顶山市| 崇州市| 延寿县| 万宁市| 石嘴山市| 乐昌市| 连平县| 土默特左旗| 织金县| 洛南县| 五寨县| 怀宁县| 英山县| 铅山县| 白河县| 凤山市| 万山特区| 澜沧| 永清县| 南和县| 高台县| 百色市| 中江县| 南通市| 杨浦区| 噶尔县| 甘孜县|