本文只說現在python繼承順序採用的c3演算法,只要弄明白c3演算法,你就知道super函式的工作原理。
c3演算法的規則如下
①.從底層開始,選擇入邊為零的點。
②.從左到右。
③深度探索。但受限與②規則。
每乙個類都可以用mro函式檢視自己的繼承順序
例子1.菱形繼承1
分析 ①規則。得到a類,去掉a類以後,入邊為零的是b類和c類
②規則。選擇b類,去掉b類後,入邊為零的只有c類。結論是a–>b–>c–>d。結果如下所示。
(, , , , )
2.菱形繼承2
分析
①規則,得到a類,去掉a類以後,入邊為零的是b類和c類;
②規則,得到b類,去掉b類以後,入邊為零的d類和c類;
③規則,深度探索得到d類,去掉d類以後入邊為零的只有c類,繼承順序為a–>b–>d;
然後重複上述三步驟,得到繼承順序c–>e–>f。總的順序為a–>b–>d–>c–>e–>f。執行結果如下。
(,
'__main__.b'>,
'__main__.d'>,
'__main__.c'>,
'__main__.e'>,
'__main__.f'>,
'object'>)
3.多重繼承1
分析
①規則,得到a類,去掉a類以後,入邊為零的是b類和c類。
②規則,選擇b類,去掉b類以後,入邊為零的是d類和c類。
③規則,選擇d類,去掉d類以後,入邊為零的是c類,所以得到繼承順序:a–>b–>d。
①規則,得到c類,去掉c類以後,入邊為零的是e類和f類。
②規則,得到e類,去掉e類以後,入邊為零的是f類,所以得到順序是c–>e–>f–g。
總的繼承順序就是a–>b–>d–>c–>e–>f–g。結果如下。
(,
'__main__.b'>,
'__main__.d'>,
'__main__.c'>,
'__main__.e'>,
'__main__.f'>,
'__main__.g'>,
'object'>)
4 多重繼承2
分析
①規則,得到a類,去掉a類以後,入邊為零的是b類和c類。
②規則,選擇b類,去掉b類以後,入邊為零的是e類和c類。
③規則,對於b類來說d類和e類都是基類,受限於②規則,繼承順序中d類一定在e類前面,但是d類有入邊,所以後面只能選擇c類。於是得到繼承順序a–>b。
①規則,得到c類,去掉c類以後,入邊為零的是d,e,f類。
②後面d,e,f類順序出現,所以得到繼承順序為c–>d–>e–>f–>g。總的繼承順序為a–>b–>c–>d–>e–>f–>g。結果如下。
(,
'__main__.b'>,
'__main__.c'>,
'__main__.d'>,
'__main__.e'>,
'__main__.f'>,
'__main__.g'>,
'object'>)
如果你能明白上面所說的繼承順序,super函式工作原理就明白了。super(class,self)這個函式就是獲取繼承順序中的class類的下乙個類。
class
x(object):
defout
(self):
print('x')
class
y(object):
defout
(self):
print('y')
class
z(x,y):
defout
(self):
super(z,self).out()#獲取繼承順序中z類下乙個類,即x
class
m(x,y):
defout
(self):
super(x,self).out()#獲取繼承順序x類下乙個類,即y
z().out()#輸出x
m().out()#輸出y
多重繼承 Python的封裝繼承多型和多重繼承
相信你一定知道繼承,多型和封裝。封裝通常是為了提供統一介面而將具體實現過程或者屬性以方法或者類的方式對外呈現 繼承就是子類繼承父類從而擁有父類的方法和屬性 多型是繼承了同乙個父類的不同子類分別重寫了父類的某個方法而使得這個方法在不同的子類中有不同的實現。多重繼承即子類繼承多個父類,擁有多個父類的方法...
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...