摘要:記住以下幾點直接子類化內置類型如或容易出錯因為內置類型的方法通常會忽略用戶覆蓋的方法不要子類化內置類型用戶自定義的類應該繼承模塊錯誤案例錯誤案例正確案例正確案例多重繼承有關的另一個問題就是如果同級別的超類定義了同名屬性如何確定使用哪個輸出
記住以下幾點:
直接子類化內置類型(如dict,list或str)容易出錯,因為內置類型的方法通常會忽略用戶覆蓋的方法,不要子類化內置類型,用戶自定義的類應該繼承collections模塊.
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
多重繼承有關的另一個問題就是:如果同級別的超類定義了同名屬性.Python如何確定使用哪個?
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()) # 輸出來源于B print(C.pong(d)) #輸出來源于C 超類的方法都可以直接調用,此時要把實例作為顯示參數傳入.
python能區別調用的是哪個方法,通過方法解析順序
>>> D.mro()
[
若想把方法調用委托給超類,推薦的方式是使用內置的super()函數.
以下是對于d.pingpong()方法的解讀
>>> self.ping()
Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 第一個調用的是self.ping(),運行的是是D類的ping,方法.
第二個調用的的是super().ping(),跳過D類的ping方法,找到A類的ping方法.Ping: <__main__.D object at 0x000002213877F2B0>
第三個調用的是self.pong()方法,根據__mro__,找到B類實現的pong方法. pong: <__main__.D object at 0x000002213877F2B0>
第四個調用時super().pong(),也是根據__mro__,找到B類實現的pong方法. pong: <__main__.D object at 0x000002213877F2B0>
第五個調用的是C.pong(self),忽略了__mro__,找到的是C類實現的pong方法. PONG: <__main__.D object at 0x000002213877F2B0>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42426.html
摘要:飛機就是一種交通工具,可飛行的能力是是飛機的屬性,通過繼承接口來獲取語言可沒有接口功能,但是它可以多重繼承。說是,因為從語法上看,的確是通過多重繼承實現的。所以從含義上理解,只是一個,不是一個。比如飛機照樣可以載客,就是不能飛了 REST API設計理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:飛機就是一種交通工具,可飛行的能力是是飛機的屬性,通過繼承接口來獲取語言可沒有接口功能,但是它可以多重繼承。說是,因為從語法上看,的確是通過多重繼承實現的。所以從含義上理解,只是一個,不是一個。比如飛機照樣可以載客,就是不能飛了 REST API設計理念 showImg(https://segmentfault.com/img/remote/1460000019923606);sho...
摘要:本章主要是對上一章類的補充。對于多態的補充子類可以被看成是父類的類型,但父類不能被看成是子類的類型。仍然以類為例,動物里有哺乳動物,卵生動物,有能飛的動物和不能飛的動物,這是兩種大的分類方式。一般在中,以為結尾類的都作為接口。 《Python編程:從入門到實踐》筆記。本章主要是對上一章Python類的補充。 1. 從一個類派生出所有類 上一篇文章說道Python類的定義與繼承一般是如下...
摘要:優先順序模糊多重繼承的優先順序,方法調用順序不明確。在松本行弘的松本行弘的程序世界中介紹了中類的幾個原則通常的繼承用單一繼承第二個以及兩個以上的父類必須是的抽象類中的多重繼承應該也適用。 我們前面理解了類。類就是把具體事物給抽象出來。其實也有歸類、類別的意思。我們舉一個例子:人的職業有Teacher、Coder、Writer、Singer等職業繼承關系就是: Pe...
摘要:本文重點不要試圖在內置類型的子類中重寫方法,可以繼承的可拓展類尋求變通掌握多重繼承中的和了解處理多重繼承的一些建議。子類化的代碼如下輸出小結上述問題只發生在語言實現的內置類型子類化情況中,而且只影響直接繼承內置類型的自定義類。 導語:本文章記錄了本人在學習Python基礎之面向對象篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、不要試圖在內置...
閱讀 1631·2021-10-27 14:13
閱讀 1868·2021-10-11 10:59
閱讀 3367·2021-09-24 10:26
閱讀 1925·2019-08-30 12:48
閱讀 3041·2019-08-30 12:46
閱讀 2033·2019-08-30 11:16
閱讀 1414·2019-08-30 10:48
閱讀 2740·2019-08-29 16:54