最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析python繼承與多重繼承

 更新時(shí)間:2018年09月13日 11:28:32   投稿:laozhang  
在本篇文章中我們給大家分析了python繼承與多重繼承的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的讀者們參考下。

記住以下幾點(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()

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

若想把方法調(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>

相關(guān)文章

  • TensorFlow教程Softmax邏輯回歸識(shí)別手寫數(shù)字MNIST數(shù)據(jù)集

    TensorFlow教程Softmax邏輯回歸識(shí)別手寫數(shù)字MNIST數(shù)據(jù)集

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)的TensorFlow教程基于Softmax邏輯回歸識(shí)別手寫數(shù)字的MNIST數(shù)據(jù)集示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • 解決Django連接db遇到的問(wèn)題

    解決Django連接db遇到的問(wèn)題

    今天小編大家分享一篇解決Django連接db遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python實(shí)現(xiàn)隨機(jī)加減法生成器

    python實(shí)現(xiàn)隨機(jī)加減法生成器

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)加減法生成器,練手小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 最新評(píng)論

    新安县| 疏勒县| 汪清县| 赤水市| 刚察县| 鄢陵县| 九龙城区| 北辰区| 延安市| 怀集县| 澳门| 富顺县| 揭东县| 怀安县| 云安县| 扶风县| 含山县| 合江县| 阿拉尔市| 三门峡市| 武威市| 北安市| 武穴市| 合川市| 太谷县| 龙岩市| 夏邑县| 保山市| 高邑县| 藁城市| 江源县| 上杭县| 佳木斯市| 荥经县| 万宁市| 贺兰县| 青田县| 烟台市| 彩票| 布尔津县| 安新县|