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

首頁 > 編程 > Python > 正文

python的多重繼承的理解

2019-11-25 15:57:44
字體:
來源:轉載
供稿:網友

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的多重繼承的詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天等县| 郁南县| 塔河县| 桓台县| 云和县| 罗江县| 时尚| 汕头市| 合水县| 阿城市| 徐闻县| 绵竹市| 乐山市| 镇远县| 南安市| 内黄县| 陆河县| 佛山市| 阳原县| 双峰县| 图们市| 高平市| 黑水县| 乌兰浩特市| 浦城县| 郑州市| 禹州市| 丹江口市| 于都县| 莲花县| 密山市| 德令哈市| 杭锦旗| 长岭县| 北辰区| 灵川县| 屏山县| 嫩江县| 黄大仙区| 松阳县| 呼伦贝尔市|