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

首頁 > 編程 > Python > 正文

python的多重繼承的理解

2020-02-16 02:01:17
字體:
來源:轉載
供稿:網友

python的多重繼承的理解

Python和C++一樣,支持多繼承。概念雖然容易,但是困難的工作是如果子類調用一個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。

對經典類和新式類來說,屬性的查找順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現:

經典類:

#! /usr/bin/python# -*- coding:utf-8 -*-class P1(): def foo(self):  print 'p1-foo'class P2(): def foo(self):  print 'p2-foo' def bar(self):  print 'p2-bar'class C1(P1,P2): passclass C2(P1,P2): def bar(self):  print 'C2-bar'class D(C1,C2): passif __name__ =='__main__': d=D() d.foo() d.bar()

執行的結果:

p1-foop2-bar

將代碼實例,畫了一個圖,方便理解:

從上面經典類的輸出結果來看,

實例d調用foo()時,搜索順序是 D => C1 => P1,

實例d調用bar()時,搜索順序是 D => C1 => P1 => P2

總結:經典類的搜索方式是按照“從左至右,深度優先”的方式去查找屬性。d先查找自身是否有foo方法,沒有則查找最近的父類C1里是否有該方法,如果沒有則繼續向上查找,直到在P1中找到該方法,查找結束。

 新式類: 

#! /usr/bin/python# -*- coding:utf-8 -*-class P1(object): def foo(self):  print 'p1-foo'  class P2(object): def foo(self):  print 'p2-foo' def bar(self):  print 'p2-bar'  class C1(P1,P2): pass class C2(P1,P2): def bar(self):  print 'C2-bar'  class D(C1,C2): pass  if __name__ =='__main__': print D.__mro__ #只有新式類有__mro__屬性,告訴查找順序是怎樣的 d=D() d.foo() d.bar()

執行的結果:

(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>)p1-fooC2-bar

從上面新式類的輸出結果來看,

實例d調用foo()時,搜索順序是 D => C1 => C2 => P1

實例d調用bar()時,搜索順序是 D => C1 => C2

總結:新式類的搜索方式是采用“廣度優先”的方式去查找屬性。

以上就是Python的多重繼承的詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柳林县| 临沧市| 漾濞| 贵南县| 茌平县| 贵南县| 丹巴县| 桑日县| 通道| 沙洋县| 大兴区| 陵川县| 正宁县| 防城港市| 高陵县| 肇州县| 南溪县| 绥宁县| 乌鲁木齐县| 扎赉特旗| 黔西| 武平县| 高雄市| 台东县| 繁昌县| 泰安市| 卫辉市| 安徽省| 苏尼特右旗| 海门市| 沙河市| 黄平县| 宝兴县| 长宁县| 民和| 汤原县| 丹巴县| 砚山县| 澄迈县| 汶川县| 淳安县|