python-多继承
python中的多繼承
python和C++一樣,支持多繼承。概念雖然容易,但是困難的工作是如果子類調(diào)用一個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。
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?
??
對經(jīng)典類和新式類來說,屬性的查找順序是不同的。現(xiàn)在我們分別看一下經(jīng)典類和新式類兩種不同的表現(xiàn)
1、經(jīng)典類
d=D()?
d.foo()?#?輸出?p1-foo?
d.bar()?#?輸出?p2-bar?
實例d調(diào)用foo()時,搜索順序是 D => C1 => P1
實例d調(diào)用bar()時,搜索順序是 D => C1 => P1 => P2
換句話說,經(jīng)典類的搜索方式是按照“從左至右,深度優(yōu)先”的方式去查找屬性。d先查找自身是否有foo方法,沒有則查找最近的父類C1里是否有該方法,如果沒有則繼續(xù)向上查找,直到在P1中找到該方法,查找結(jié)束。
2、新式類
使用新式類要去掉第一段代碼中的注釋
d=D()?
d.foo()?#?輸出?p1-foo?
d.bar()?#?輸出?c2-bar?
實例d調(diào)用foo()時,搜索順序是 D => C1 => C2 => P1
實例d調(diào)用bar()時,搜索順序是 D => C1 => C2
可以看出,新式類的搜索方式是采用“廣度優(yōu)先”的方式去查找屬性。
轉(zhuǎn)載于:https://blog.51cto.com/mannu/1692948
總結(jié)
以上是生活随笔為你收集整理的python-多继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 网络 read,Linux
- 下一篇: Saltstack 报错 python-