国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

總結(jié)python實現(xiàn)父類調(diào)用兩種方法的不同

2019-11-25 16:24:25
字體:
供稿:網(wǎng)友

python中有兩種方法可以調(diào)用父類的方法:

super(Child, self).method(args)

 Parent.method(self, args)

我用其中的一種報了如下錯誤:

找不到 classobj。當(dāng)我把調(diào)用改為 super(B, self).f(name) 就能正確運行,且結(jié)果正確。

分析錯誤

因為基類沒有繼承 object , 在python中,一個可以這樣創(chuàng)建:

class A: pass

也可以這樣創(chuàng)建:

class A(object): pass

這兩者的區(qū)別就是:

這是老式類(前者)和新式類(后者)的區(qū)別。區(qū)別可以參考:https://docs.python.org/release/2.5.2/ref/node33.html

python3已經(jīng)把舊類型去掉了,也就是說已經(jīng)隱式繼承了object,所以,python3中寫不寫繼承object都是沒有區(qū)別的

兩種調(diào)用的區(qū)別

Parent.__init__(self) super(Child, self).__init__() 的區(qū)別是什么?

super 理解成父類也是理所當(dāng)然,python里其實指的是 MRO 中的下一個類!

super其實干了這件事,看這個答案:

def super(cls, inst): mro = inst.__class__.mro() # Always the most derived class return mro[mro.index(cls) + 1]

MRO 全稱 Method Resolution Order,它代表了類繼承的順序。

super 是用來解決多重繼承問題的,假設(shè)B C D 都是直接繼承class A

class E(B, C, D): def __init__(self):  # code...

如果E類的構(gòu)造函數(shù)使用 super(E, self).__init__() 時,A類的構(gòu)造函數(shù)會被執(zhí)行一次,而用另一種方法,A類的構(gòu)造函數(shù)會被執(zhí)行多次。

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

總結(jié)

個人覺得,復(fù)雜的繼承結(jié)構(gòu)是設(shè)計中不良的設(shè)計,當(dāng)繼承結(jié)構(gòu)清晰后,兩個方法其實就沒什么區(qū)別了。以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 冷水江市| 建宁县| 措美县| 娄烦县| 涡阳县| 广州市| 通州区| 武山县| 抚松县| 芷江| 济阳县| 永康市| 沐川县| 佛山市| 云林县| 斗六市| 吴川市| 甘孜县| 北宁市| 江孜县| 盱眙县| 岳阳市| 赤水市| 永德县| 兴海县| 罗田县| 澳门| 长宁区| 治县。| 湾仔区| 淄博市| 桦川县| 明光市| 盐山县| 新郑市| 靖宇县| 佛山市| 论坛| 武义县| 天等县| 梅河口市|