python和c++一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。
對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現:
經典類:
#執行的結果:! /usr/bin/python
#-*- coding:utf-8 -*-
class
p1():
deffoo(self):
'p1-foo
'class
p2():
deffoo(self):
'p2-foo
'def
bar(self):
'p2-bar
'class
c1(p1,p2):
pass
class
c2(p1,p2):
defbar(self):
'c2-bar
'class
d(c1,c2):
pass
if__name__ =='
__main__':
d=d()
d.foo()
d.bar()
p1-foo
p2-bar
將**例項,畫了乙個圖,方便理解:
從上面經典類的輸出結果來看,
例項d呼叫foo()時,搜尋順序是 d => c1 => p1,
例項d呼叫bar()時,搜尋順序是 d => c1 => p1 => p2
新式類:
#執行的結果:! /usr/bin/python
#-*- coding:utf-8 -*-
class
p1(object):
deffoo(self):
'p1-foo
'class
p2(object):
deffoo(self):
'p2-foo
'def
bar(self):
'p2-bar
'class
c1(p1,p2):
pass
class
c2(p1,p2):
defbar(self):
'c2-bar
'class
d(c1,c2):
pass
if__name__ =='
__main__':
print d.__mro__ #只有新式類有__mro__屬性,告訴查詢順序是怎樣的
d=d()
d.foo()
d.bar()
(, , , , , )
p1-foo
c2-bar
從上面新式類的輸出結果來看,
例項d呼叫foo()時,搜尋順序是 d => c1 => c2 => p1
例項d呼叫bar()時,搜尋順序是 d => c1 => c2
總結:新式類的搜尋方式是採用「廣度優先」的方式去查詢屬性。
python的多重繼承
在設計類的繼承關係時,通常,主線都是單一繼承下來的,如果需要 混入 額外的功能,通過多重繼承就可以實現,這種設計通常稱之為mixin。class animal object pass class mammal animal pass class runnable object def run sel...
python 多重繼承
python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...
Python多重繼承
class printa namea printa def set value self,a self.a a def set namea self,namea printa.namea namea def info self print printa s,s printa.namea,self.a...