摘要:記住以下幾點(diǎn)直接子類化內(nèi)置類型如或容易出錯(cuò)因?yàn)閮?nèi)置類型的方法通常會(huì)忽略用戶覆蓋的方法不要子類化內(nèi)置類型用戶自定義的類應(yīng)該繼承模塊錯(cuò)誤案例錯(cuò)誤案例正確案例正確案例多重繼承有關(guān)的另一個(gè)問(wèn)題就是如果同級(jí)別的超類定義了同名屬性如何確定使用哪個(gè)輸出
記住以下幾點(diǎn):
直接子類化內(nèi)置類型(如dict,list或str)容易出錯(cuò),因?yàn)閮?nèi)置類型的方法通常會(huì)忽略用戶覆蓋的方法,不要子類化內(nèi)置類型,用戶自定義的類應(yīng)該繼承collections模塊.
def __setitem__(self, key, value): super().__setitem__(key, [value] * 2) # 錯(cuò)誤案例 class AnswerDict(dict): def __getitem__(self, item): # 錯(cuò)誤案例 return 42 import collections class DoppelDict2(collections.UserDict): # 正確案例 def __setitem__(self, key, value): super().__setitem__(key, [value] * 2) class AnswerDict2(collections.UserDict): # 正確案例 def __getitem__(self, item): return 42
多重繼承有關(guān)的另一個(gè)問(wèn)題就是:如果同級(jí)別的超類定義了同名屬性.Python如何確定使用哪個(gè)?
class DoppelDict(dict): def __setitem__(self, key, value): super().__setitem__(key, [value] * 2) class AnswerDict(dict): def __getitem__(self, item): return 42 import collections class DoppelDict2(collections.UserDict): def __setitem__(self, key, value): super().__setitem__(key, [value] * 2) class AnswerDict2(collections.UserDict): def __getitem__(self, item): return 42 class A: def ping(self): print("Ping:", self) class B(A): def pong(self): print("pong:", self) class C(A): def pong(self): print("PONG:", self) class D(B, C): def ping(self): super().ping() print("post-ping:", self) def pingpong(self): self.ping() super().ping() self.pong() super().pong() C.pong(self) if __name__ == "__main__": d = D() print(d.pong()) # 輸出來(lái)源于B print(C.pong(d)) #輸出來(lái)源于C 超類的方法都可以直接調(diào)用,此時(shí)要把實(shí)例作為顯示參數(shù)傳入.
python能區(qū)別調(diào)用的是哪個(gè)方法,通過(guò)方法解析順序
>>> D.mro()
[
若想把方法調(diào)用委托給超類,推薦的方式是使用內(nèi)置的super()函數(shù).
以下是對(duì)于d.pingpong()方法的解讀
>>> self.ping()
Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 第一個(gè)調(diào)用的是self.ping(),運(yùn)行的是是D類的ping,方法.
第二個(gè)調(diào)用的的是super().ping(),跳過(guò)D類的ping方法,找到A類的ping方法.Ping: <__main__.D object at 0x000002213877F2B0>
第三個(gè)調(diào)用的是self.pong()方法,根據(jù)__mro__,找到B類實(shí)現(xiàn)的pong方法. pong: <__main__.D object at 0x000002213877F2B0>
第四個(gè)調(diào)用時(shí)super().pong(),也是根據(jù)__mro__,找到B類實(shí)現(xiàn)的pong方法. pong: <__main__.D object at 0x000002213877F2B0>
第五個(gè)調(diào)用的是C.pong(self),忽略了__mro__,找到的是C類實(shí)現(xiàn)的pong方法. PONG: <__main__.D object at 0x000002213877F2B0>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42426.html
摘要:飛機(jī)就是一種交通工具,可飛行的能力是是飛機(jī)的屬性,通過(guò)繼承接口來(lái)獲取語(yǔ)言可沒(méi)有接口功能,但是它可以多重繼承。說(shuō)是,因?yàn)閺恼Z(yǔ)法上看,的確是通過(guò)多重繼承實(shí)現(xiàn)的。所以從含義上理解,只是一個(gè),不是一個(gè)。比如飛機(jī)照樣可以載客,就是不能飛了 REST API設(shè)計(jì)理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:飛機(jī)就是一種交通工具,可飛行的能力是是飛機(jī)的屬性,通過(guò)繼承接口來(lái)獲取語(yǔ)言可沒(méi)有接口功能,但是它可以多重繼承。說(shuō)是,因?yàn)閺恼Z(yǔ)法上看,的確是通過(guò)多重繼承實(shí)現(xiàn)的。所以從含義上理解,只是一個(gè),不是一個(gè)。比如飛機(jī)照樣可以載客,就是不能飛了 REST API設(shè)計(jì)理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:本章主要是對(duì)上一章類的補(bǔ)充。對(duì)于多態(tài)的補(bǔ)充子類可以被看成是父類的類型,但父類不能被看成是子類的類型。仍然以類為例,動(dòng)物里有哺乳動(dòng)物,卵生動(dòng)物,有能飛的動(dòng)物和不能飛的動(dòng)物,這是兩種大的分類方式。一般在中,以為結(jié)尾類的都作為接口。 《Python編程:從入門到實(shí)踐》筆記。本章主要是對(duì)上一章Python類的補(bǔ)充。 1. 從一個(gè)類派生出所有類 上一篇文章說(shuō)道Python類的定義與繼承一般是如下...
摘要:優(yōu)先順序模糊多重繼承的優(yōu)先順序,方法調(diào)用順序不明確。在松本行弘的松本行弘的程序世界中介紹了中類的幾個(gè)原則通常的繼承用單一繼承第二個(gè)以及兩個(gè)以上的父類必須是的抽象類中的多重繼承應(yīng)該也適用。 我們前面理解了類。類就是把具體事物給抽象出來(lái)。其實(shí)也有歸類、類別的意思。我們舉一個(gè)例子:人的職業(yè)有Teacher、Coder、Writer、Singer等職業(yè)繼承關(guān)系就是: Pe...
摘要:本文重點(diǎn)不要試圖在內(nèi)置類型的子類中重寫方法,可以繼承的可拓展類尋求變通掌握多重繼承中的和了解處理多重繼承的一些建議。子類化的代碼如下輸出小結(jié)上述問(wèn)題只發(fā)生在語(yǔ)言實(shí)現(xiàn)的內(nèi)置類型子類化情況中,而且只影響直接繼承內(nèi)置類型的自定義類。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、不要試圖在內(nèi)置...
閱讀 1643·2021-10-27 14:13
閱讀 1883·2021-10-11 10:59
閱讀 3381·2021-09-24 10:26
閱讀 1937·2019-08-30 12:48
閱讀 3046·2019-08-30 12:46
閱讀 2043·2019-08-30 11:16
閱讀 1427·2019-08-30 10:48
閱讀 2749·2019-08-29 16:54