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

深入理解Python中的super()方法

 更新時(shí)間:2017年11月20日 10:06:40   作者:neon_  
super 是用來解決多重繼承問題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒問題,但是如果使用多繼承,會(huì)涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。這篇文章主要給大家介紹了關(guān)于Python中super()方法的相關(guān)資料,需要的朋友可以參考下。

前言

python的類分別有新式類和經(jīng)典類,都支持多繼承。在類的繼承中,如果你想要重寫父類的方法而不是覆蓋的父類方法,這個(gè)時(shí)候我們可以使用super()方法來實(shí)現(xiàn)

python語言與C++有相似的類繼承,在類定義時(shí),python中會(huì)自定義第一個(gè)self,類似C++中this指針,指向?qū)ο笞陨怼?br />

python簡(jiǎn)單的類舉例:

>>> class hello(object): 
...     def print_c(): 
...       print"hello world!" 
>>> hello().print_c() 
hello world! 

當(dāng)然在實(shí)際中不可避免的需要類的繼承,子類繼承父類,正常如下:

>>> class child(hello): 
...     def print_c(self): 
...         hello().print_c() 
...          
>>> child().print_c() 
hello world! 

在python中還提供了super()機(jī)制,例子如下:

>>> class hello(object): 
...     def print_c(self): 
...       print"hello world!" 
...        
>>> class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
>>> child().print_c() 
hello world! 

注意

Python2.2以前的版本:經(jīng)典類(classic class)時(shí)代

經(jīng)典類是一種沒有繼承的類,實(shí)例類型都是type類型,如果經(jīng)典類被作為父類,子類調(diào)用父類的構(gòu)造函數(shù)時(shí)會(huì)返回這樣的錯(cuò)誤 '''TypeError: must be type, not classobj'''

這時(shí)MRO的方法為DFS(深度優(yōu)先搜索(子節(jié)點(diǎn)順序:從左到右))。所以本文中使用的是新式類,而新式類的搜索算法是C3算法

class C(object):
 def minus(self,x):
  return x/2

class D(C):
 def minus(self,x):
  super(D, self).minus()
  print 'hello'

上面的代碼中C是父類,D是子類,我們?cè)贒類重新定義了minus方法,就是在C類的功能基礎(chǔ)基礎(chǔ)上新添print 'hello'功能。super在這里的作用就是在子類中調(diào)用父類的方法,這個(gè)也是在單繼承常見調(diào)用super()的用法。那么問題來了

class A(object):
 def __init__(self):
  self.n = 10

 def minus(self, m):
  self.n -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=B()
b.minus(2)
print b.n

那么上面的代碼中b.n的輸出是什么呢?為什么結(jié)果是2呢,而不是5呢?super(B,self).minus(m)明明是調(diào)用了父類的minus方法,可是輸出結(jié)果就是2,是你要明白現(xiàn)在B的實(shí)例,而不是A的實(shí)例,那么傳遞的self.n的數(shù)值是7,而不是10.

那么對(duì)于多繼承的時(shí)候,super又是怎樣工作的呢?來,現(xiàn)在創(chuàng)建一個(gè)繼承A的C類,然后再創(chuàng)建一個(gè)繼承B,C的D類,看看怎樣調(diào)用super是重寫方法。

class C(A):
 def __init__(self):
  self.n = 12

 def minus(self, m):
  super(C,self).minus(m)
  self.n -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

如上的代碼輸出的結(jié)果是什么呢?別心急,先看看它是怎樣運(yùn)行的。上面提及到新式類尋找子節(jié)點(diǎn)時(shí)候使用的是C3算法。那么它是怎么找呢。D->B->C->A->object。怎樣才能驗(yàn)證這個(gè)順序是對(duì)的呢。

D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

Mro是什么呢?對(duì)于你定義的每一個(gè)類,Python 會(huì)計(jì)算出一個(gè)方法解析順序(Method Resolution Order, MRO)列表,它代表了類繼承的順序。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python OS模塊實(shí)例詳解

    Python OS模塊實(shí)例詳解

    這篇文章主要介紹了Python OS模塊,結(jié)合實(shí)例形式總結(jié)分析了Python使用OS解析文件路徑、判斷文件、目錄等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • 淺談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的

    淺談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的

    下面小編就為大家?guī)硪黄獪\談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 對(duì)python .txt文件讀取及數(shù)據(jù)處理方法總結(jié)

    對(duì)python .txt文件讀取及數(shù)據(jù)處理方法總結(jié)

    下面小編就為大家分享一篇對(duì)python .txt文件讀取及數(shù)據(jù)處理方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python爬取豆瓣數(shù)據(jù)實(shí)現(xiàn)過程解析

    Python爬取豆瓣數(shù)據(jù)實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Python爬取豆瓣數(shù)據(jù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程

    Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程

    xhEditor是基于jQuery的Web端文本編輯器,基本的圖片上傳等功能也都帶有,這里我們就來看一下Python的Flask站點(diǎn)中集成xhEditor文本編輯器的教程
    2016-06-06
  • 使用PyGame顯示圖像的四種方案實(shí)例代碼

    使用PyGame顯示圖像的四種方案實(shí)例代碼

    由于前面學(xué)習(xí)了使用pygame的簡(jiǎn)單操作,現(xiàn)在學(xué)習(xí)當(dāng)前的pygame怎么加載圖片,下面這篇文章主要給大家介紹了關(guān)于使用PyGame顯示圖像的四種方案,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決

    python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決

    這篇文章主要介紹了python pandas合并Sheet,處理列亂序和出現(xiàn)Unnamed列的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    Python利用緩存流實(shí)現(xiàn)壓縮PDF文件

    在Python中,有許多庫(kù)可以用來壓縮PDF文件,其中最常用的是PyPDF2和PDFMiner,本文將為大家介紹一個(gè)新的方法,即使用緩存流壓縮PDF文件,感興趣的可以了解下
    2023-08-08
  • pandas實(shí)現(xiàn)選取特定索引的行

    pandas實(shí)現(xiàn)選取特定索引的行

    下面小編就為大家分享一篇pandas實(shí)現(xiàn)選取特定索引的行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • PyQt5+QtChart繪制散點(diǎn)圖

    PyQt5+QtChart繪制散點(diǎn)圖

    QChart是一個(gè)QGraphicScene中可以顯示的QGraphicsWidget。本文將利用QtChart實(shí)現(xiàn)繪制散點(diǎn)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12

最新評(píng)論

灵台县| 化隆| 福州市| 望都县| 丘北县| 兴国县| 凉山| 当涂县| 贡嘎县| 上杭县| 图木舒克市| 天门市| 盐源县| 施甸县| 富宁县| 吉隆县| 肥西县| 全椒县| 黑水县| 吉隆县| 三都| 贞丰县| 瑞丽市| 宝兴县| 平度市| 阳西县| 沂南县| 桂平市| 东乌珠穆沁旗| 咸宁市| 明溪县| 滕州市| 金昌市| 湖南省| 山阴县| 荆州市| 嘉黎县| 南靖县| 象州县| 和顺县| 武夷山市|