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

首頁 > 編程 > Python > 正文

淺析python繼承與多重繼承

2020-01-04 14:32:38
字體:
供稿:網(wǎng)友

記住以下幾點:

直接子類化內(nèi)置類型(如dict,list或str)容易出錯,因為內(nèi)置類型的方法通常會忽略用戶覆蓋的方法,不要子類化內(nèi)置類型,用戶自定義的類應(yīng)該繼承collections模塊。

  def __setitem__(self, key, value):    super().__setitem__(key, [value] * 2) # 錯誤案例class AnswerDict(dict):  def __getitem__(self, item): # 錯誤案例    return 42import collectionsclass 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)的另一個問題就是:如果同級別的超類定義了同名屬性.Python如何確定使用哪個?

class DoppelDict(dict):  def __setitem__(self, key, value):    super().__setitem__(key, [value] * 2)class AnswerDict(dict):  def __getitem__(self, item):    return 42import collectionsclass DoppelDict2(collections.UserDict):  def __setitem__(self, key, value):    super().__setitem__(key, [value] * 2)class AnswerDict2(collections.UserDict):  def __getitem__(self, item):    return 42class 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 超類的方法都可以直接調(diào)用,此時要把實例作為顯示參數(shù)傳入.

python能區(qū)別調(diào)用的是哪個方法,通過方法解析順序

>>> D.mro() 

[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

若想把方法調(diào)用委托給超類,推薦的方式是使用內(nèi)置的super()函數(shù).

以下是對于d.pingpong()方法的解讀

>>> self.ping()

Ping: <__main__.D object at 0x000002213877F2B0> post-ping: <__main__.D object at 0x000002213877F2B0> 第一個調(diào)用的是self.ping(),運行的是是D類的ping,方法.

第二個調(diào)用的的是super().ping(),跳過D類的ping方法,找到A類的ping方法.Ping: <__main__.D object at 0x000002213877F2B0>

第三個調(diào)用的是self.pong()方法,根據(jù)__mro__,找到B類實現(xiàn)的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第四個調(diào)用時super().pong(),也是根據(jù)__mro__,找到B類實現(xiàn)的pong方法. pong: <__main__.D object at 0x000002213877F2B0>

第五個調(diào)用的是C.pong(self),忽略了__mro__,找到的是C類實現(xiàn)的pong方法. PONG: <__main__.D object at 0x000002213877F2B0>


注:相關(guān)教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 错那县| 日照市| 承德市| 宝兴县| 新沂市| 台中县| 凤冈县| 惠来县| 铅山县| 湖北省| 响水县| 长葛市| 南投市| 育儿| 石楼县| 郴州市| 林口县| 敖汉旗| 织金县| 云浮市| 客服| 新丰县| 城固县| 东源县| 鹤岗市| 枞阳县| 镇康县| 花莲市| 黄山市| 界首市| 黑龙江省| 九龙县| 清涧县| 桂平市| 微山县| 乌拉特后旗| 宁明县| 平远县| 永善县| 卓尼县| 迁安市|