国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python super()就是這樣

laznrbfe / 1861人閱讀

摘要:所以本文中使用的是新式類,而新式類的搜索算法是算法上面的代碼中是父類,是子類,我們?cè)陬愔匦露x了方法,就是在類的功能基礎(chǔ)基礎(chǔ)上新添功能。在這里的作用就是在子類中調(diào)用父類的方法,這個(gè)也是在單繼承常見調(diào)用的用法。

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

注意

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()的用法。那么問題來(lái)了

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又是怎樣工作的呢?來(lái),現(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__
(, , , , )

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44469.html

相關(guān)文章

  • Python入門學(xué)習(xí)(八)

    摘要:面向?qū)ο箢悓?duì)象實(shí)例類是一個(gè)抽象的存在實(shí)例是真實(shí)存在的類對(duì)象是類的實(shí)例好比說(shuō)門就是一個(gè)類我的屋門就是門的一個(gè)實(shí)例我的屋門是白顏色的而且打開和關(guān)閉時(shí)會(huì)發(fā)出聲響不管是顏色還是打開和關(guān)閉都是類賦予的屬性和行為至于白顏色和打開和關(guān)閉時(shí)發(fā)出的聲響是這個(gè) 面向?qū)ο驩OP 類(Class) 對(duì)象(Object) 實(shí)例(Instance) 類: 是一個(gè)抽象的存在實(shí)例: 是真實(shí)存在的類 對(duì)象: ...

    Jaden 評(píng)論0 收藏0
  • super 沒那么簡(jiǎn)單

    摘要:說(shuō)到,大家可能覺得很簡(jiǎn)單呀,不就是用來(lái)調(diào)用父類方法的嘛。單繼承在單繼承中就像大家所想的那樣,主要是用來(lái)調(diào)用父類的方法的。你覺得執(zhí)行下面代碼后,的值是多少呢執(zhí)行結(jié)果如下這個(gè)結(jié)果說(shuō)明了兩個(gè)問題確實(shí)調(diào)用了父類的方法。 說(shuō)到 super, 大家可能覺得很簡(jiǎn)單呀,不就是用來(lái)調(diào)用父類方法的嘛。如果真的這么簡(jiǎn)單的話也就不會(huì)有這篇文章了,且聽我細(xì)細(xì)道來(lái)。? 約定 在開始之前我們來(lái)約定一下本文所使用的 ...

    xiguadada 評(píng)論0 收藏0
  • pythonsuper類的工作原理

    摘要:我們的小明,就這樣被一次次的往上傳導(dǎo)到了每一級(jí)的函數(shù)中,于是每一級(jí)打印的都是或者說(shuō)小明傻傻的分割線更新之前的說(shuō)法并不準(zhǔn)確,參見和準(zhǔn)確的說(shuō) super 的工作原理如下: def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] 其中,cls 代表類,inst 代表實(shí)例,...

    Anonymous1 評(píng)論0 收藏0
  • 神坑·Python 裝飾類無(wú)限遞歸

    摘要:如今查找結(jié)果有誤,說(shuō)明繼承鏈?zhǔn)清e(cuò)誤的,因而極有可能是出錯(cuò)。真相一切都源于裝飾器語(yǔ)法糖。核心思路就是不要更改被裝飾名稱的引用。 本文首發(fā)于我的博客,轉(zhuǎn)載請(qǐng)注明出處 《神坑》系列將會(huì)不定期更新一些可遇而不可求的坑防止他人入坑,也防止自己再次入坑 簡(jiǎn)化版問題 現(xiàn)有兩個(gè) View 類: class View(object): def method(self): #...

    spacewander 評(píng)論0 收藏0
  • python設(shè)計(jì)模式-橋接模式&比較橋接模式和裝飾模式的不同

    摘要:橋接模式和裝飾模式的區(qū)別設(shè)計(jì)模式裝飾模式橋接模式和裝飾模式都是通過(guò)將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系從而減少系統(tǒng)中類的數(shù)量,降低系統(tǒng)的耦合性。裝飾器模式支持多層裝飾,通過(guò)不同的組合可以實(shí)現(xiàn)不同的行為。 產(chǎn)生橋接模式的動(dòng)機(jī): 假設(shè)這樣一種情況:我們有大中小型號(hào)的毛筆,有紅藍(lán)黑三種顏料。如果需要不同顏色,不同型號(hào)的毛筆有如下兩種設(shè)計(jì)方法: 為每一種型號(hào)的毛筆都提供三種顏料的版本。 將毛筆和顏料分開...

    quietin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<