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

深入理解Python 關(guān)于supper 的 用法和原理

 更新時間:2018年02月28日 10:43:12   作者:calvin_xhk  
這篇文章主要介紹了Python 關(guān)于supper 的 用法和原理分析,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

一、前言

Python 面向?qū)ο笾杏欣^承這個概念,初學時感覺很牛逼,里面也有個super類,經(jīng)常見到,最近做一些題才算是理解了。特地記錄分享給后來研究的小伙伴,畢竟現(xiàn)在小學生都開始學了(滑稽臉)

二、代碼

直接上干貨,能把下面一個問題全答對,后面就不用看了。

class A():
  def go(self):
    print ("go A go!")
  def stop(self):
    print ("stop A stop!")
  def pause(self):
    raise Exception("Not Implemented")
class B(A):
  def go(self):
    super(B, self).go()
    print ("go B go!")
class C(A):
  def go(self):
    super(C, self).go()
    print ("go C go!")
  def stop(self):
    super(C, self).stop()
    print ("stop C stop!")
class D(B,C):
  def go(self):
    super(D, self).go()
    print ("go D go!")
  def stop(self):
    super(D, self).stop()
    print ("stop D stop!")
  def pause(self):
    print ("wait D wait!")
class E(B,C):
  pass
a = A()
b = B()
c = C()
d = D()
e = E()
# 說明下列代碼的輸出結(jié)果
a.go()
print('--------')
b.go()
print('--------')
c.go()
print('--------')
d.go()
print('--------')
e.go()
print('--------')
a.stop()
print('--------')
b.stop()
print('--------')
c.stop()
print('--------')
d.stop()
print('--------')
e.stop()
print(D.mro())
a.pause()
b.pause()
c.pause()
d.pause()
e.pause()

當然,直接運行就有答案了,還是要仔細想一下,反正看到我第一次跑出的結(jié)果的時候,我都不敢相信自己的眼睛。

step1:

幾個概念:

繼承的功能:父類的代碼重用

多態(tài)的功能:同一方法對不同類型的對象會有相應(yīng)的結(jié)果

開閉原則:對擴展開放,對修改封閉

super類功能:新式類實現(xiàn)廣度優(yōu)先的不重復(fù)的調(diào)用父類,解決了鉆石繼承(多繼承)的難題

step2:

super實現(xiàn)原理:通過c3算法,生成mro(method resolution order)列表,根據(jù)列表中元素順序查詢調(diào)用

新式類調(diào)用順序為廣度優(yōu)先,舊式類為深度優(yōu)先

step3:

個人理解:

1.調(diào)用了父類的方法,出入的是子類的實例對象

2.新式類子類(A,B),A就在B之前

3.super類似于嵌套的一種設(shè)計,當代碼執(zhí)行到super實例化后,先去找同級父類,若沒有其余父類,再執(zhí)行自身父類,再往下走,

  簡潔點的三個原則就是:

子類在父類前,所有類不重復(fù)調(diào)用,從左到右

理解了以上的說法,題目就沒問題了。

也不用跑了,答案如下:

a.go()# go A go!
b.go()# go A go!# go B go!
c.go()# go A go!# go C go!
d.go()# go A go!# go C go!# go B go!# go D go!
e.go()# go A go!# go C go!# go B go!
a.stop()# stop A stop!
b.stop()# stop A stop!
c.stop()# stop A stop!# stop C stop!
d.stop()# stop A stop!# stop C stop!# stop D stop!
e.stop()# stop A stop!
a.pause()# ... Exception: Not Implemented
b.pause()# ... Exception: Not Implemented
c.pause()# ... Exception: Not Implemented
d.pause()# wait D wait!
e.pause()# ...Exception: Not Implemented

看了答案,其實還有一點,父類拋異常的情況,如果子類有不拋異常的方法,異常就不拋出了,這個設(shè)計也會很有用。

這里就中間一個A,C,B,D的和網(wǎng)上常見的不太一樣,促使我仔細研究了一下,其實就是個人理解第三條。

補充:

Python2 和Python3在這個問題上的差別

Python2 沒有默認繼承object

Python3 默認全部繼承object類,都是新式類

Python2super調(diào)用 super(開始類名,self).函數(shù)名()

Python3  super().函數(shù)名()

關(guān)于調(diào)用父類函數(shù)傳入子類實例的栗子舉一個:

class A:
  def __init__(self):
    self.n = 2
  def add(self, m):
    print('self is {0} @A.add'.format(self))
    self.n += m
class B(A):
  def __init__(self):
    self.n = 3
  def add(self, m):
    print('self is {0} @B.add'.format(self))
    super().add(m)
    print('newb')
    self.n += 3
class C(A):
  def __init__(self):
    self.n = 4
  def add(self, m):
    print('self is {0} @C.add'.format(self))
    super().add(m)
    print('newc')
    self.n += 4
class D(B, C):
  def __init__(self):
    self.n = 5
  def add(self, m):
    print('self is {0} @D.add'.format(self))
    super().add(m)
    self.n += 5
d = D()
d.add(2)
print(d.n)

總結(jié)

以上所述是小編給大家介紹的Python 關(guān)于supper 的 用法和原理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • pandas中使用數(shù)據(jù)透視表的示例代碼

    pandas中使用數(shù)據(jù)透視表的示例代碼

    本文主要介紹了pandas中使用數(shù)據(jù)透視表的示例代碼,主要包含pivot_table函數(shù)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 淺談Python實時檢測CPU和GPU的功耗

    淺談Python實時檢測CPU和GPU的功耗

    本文主要介紹了淺談Python實時檢測CPU和GPU的功耗,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Tensorflow進行多維矩陣的拆分與拼接實例

    Tensorflow進行多維矩陣的拆分與拼接實例

    今天小編就為大家分享一篇Tensorflow進行多維矩陣的拆分與拼接實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python中使用platform模塊獲取系統(tǒng)信息的用法教程

    Python中使用platform模塊獲取系統(tǒng)信息的用法教程

    這里我們整理了Python中使用platform模塊獲取系統(tǒng)信息的用法教程,包括操作系統(tǒng)與Python環(huán)境以及系統(tǒng)的環(huán)境變量等信息的獲取方法:
    2016-07-07
  • 提高Matplotlib繪圖清晰度的幾種方法

    提高Matplotlib繪圖清晰度的幾種方法

    使用python中的matplotlib.pyplot繪圖的時候,如果將圖片顯示出來,或者另存為圖片,常常會出現(xiàn)清晰度不夠的問題,當然這種問題是對于png或者jpg這種格式的圖片而言的,所以本文給大家介紹了提高Matplotlib繪圖清晰度的幾種方法,需要的朋友可以參考下
    2024-01-01
  • python機器學習之線性回歸詳解

    python機器學習之線性回歸詳解

    這篇文章主要介紹了python機器學習之線性回歸詳解,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python+gdal+遙感圖像拼接(mosaic)的實例

    python+gdal+遙感圖像拼接(mosaic)的實例

    這篇文章主要介紹了python+gdal+遙感圖像拼接(mosaic)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python實現(xiàn)的文本簡單可逆加密算法示例

    Python實現(xiàn)的文本簡單可逆加密算法示例

    這篇文章主要介紹了Python實現(xiàn)的文本簡單可逆加密算法,結(jié)合完整實例形式分析了Python自定義加密與解密算法具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-05-05
  • Pandas的AB BA類型數(shù)據(jù)框去重復(fù)

    Pandas的AB BA類型數(shù)據(jù)框去重復(fù)

    這篇文章主要為大家介紹了Pandas的AB BA類型數(shù)據(jù)框去重復(fù)實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Python2中文處理紀要的實現(xiàn)方法

    Python2中文處理紀要的實現(xiàn)方法

    本篇文章主要介紹了Python2中文處理紀要的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論

正镶白旗| 德昌县| 银川市| 曲水县| 宁南县| 中江县| 广东省| 平果县| 上栗县| 沾化县| 葫芦岛市| 宜丰县| 顺昌县| 凤台县| 灵璧县| 柳林县| 六盘水市| 通山县| 固阳县| 涟水县| 南部县| 合作市| 林西县| 曲阜市| 祁连县| 崇信县| 石楼县| 九台市| 肃北| 红安县| 岐山县| 平定县| 凤台县| 乌兰浩特市| 福泉市| 玉山县| 洪江市| 比如县| 十堰市| 忻城县| 蕲春县|