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

首頁 > 編程 > Python > 正文

淺析python繼承與多重繼承

2020-02-15 22:58:47
字體:
來源:轉載
供稿:網友

記住以下幾點:

直接子類化內置類型(如dict,list或str)容易出錯,因為內置類型的方法通常會忽略用戶覆蓋的方法,不要子類化內置類型,用戶自定義的類應該繼承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

多重繼承有關的另一個問題就是:如果同級別的超類定義了同名屬性.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 超類的方法都可以直接調用,此時要把實例作為顯示參數傳入.

python能區別調用的是哪個方法,通過方法解析順序

>>> D.mro()

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

若想把方法調用委托給超類,推薦的方式是使用內置的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>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁河县| 岐山县| 德令哈市| 徐州市| 忻州市| 达孜县| 张家口市| 泾阳县| 金沙县| 根河市| 青岛市| 威远县| 贵德县| 乡宁县| 高雄县| 吴桥县| 闸北区| 容城县| 同心县| 读书| 北川| 石楼县| 桂阳县| 厦门市| 南木林县| 淮滨县| 岐山县| 石河子市| 龙山县| 遂宁市| 安康市| 漠河县| 邹平县| 渝北区| 瓮安县| 资兴市| 大同县| 金门县| 思南县| 盐亭县| 布拖县|