python3中新類如何繼承?
python中分為舊類和新類,因為小編使用的是主流的python3版本,所以我們本篇文章講的是新類。那麼在新類的繼承中,我們需要注意哪些事項呢?因為有不少小夥伴有這種疑問,所以小編趕緊蒐集了新類方面的資料,大家一起來學習一個示例,我們把這個問題一起解決出來。
首先說明一個問題,Python的多重繼承確實正如文件所言是深度優先從左至右不重複,唯一的問題是,關於優先其實是指最貼近繼承樹葉部的,左側的優先,會最後繼承,從而覆蓋其它繼承得來的效果。在Python裡,當新構造一個物件時,有兩個步驟:首先是自底向上,從左至右呼叫__new__,然後再依照遞迴棧依次呼叫__init__。這個問題可以用以下程式碼說明。
class A: def __new__(cls, *argv, **kwargs): print('nA') return super().__new__(cls) def __init__(self, a): print('A') self.a = a def comeon(self): print('A.comeon') class B(A): def __new__(cls, *argv, **kwargs): print('nB') return super().__new__(cls) def __init__(self, b): super().__init__(b) print('B') self.b = b def comeon(self): print('B.comeon') class C(A): def __new__(cls, *argv, **kwargs): print('nC') return super().__new__(cls) def __init__(self, c): super().__init__(c) print('C') self.c = c def comeon(self): print('C.comeon') class D(B, C): def __new__(cls, *argv, **kwargs): print('nD') return super().__new__(cls) def __init__(self, d): super().__init__(d) print('D') self.d = d d = D('d') d.comeon()
首先看到:d.comeon是從左自右得來的左邊的那個B的comeon。那麼如何實現這樣的效果呢?很簡單,讓B的init最後一個執行,就能覆蓋掉C和D寫入的comeon。
所以實際呼叫new的順序就是D--B--C--A,之後遞迴棧回過頭來初始化,呼叫init的順序就是A--C--B--D,只有這樣才能保證B裡的comeon能夠覆蓋掉D的init帶入的comeon和C帶入的comeon,同樣保證如果你的D裡有個comeon,它是最後一個init的,將最後寫入而覆蓋掉其它的。
相信小夥伴們已經學會python3新類的繼承方法了,其中容易出錯的地方,小編也有提到,大家仔細看一下避免出現同樣的失誤。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1868/viewspace-2832206/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python3父類需要繼承object嗎?Python繼承Object
- 類的繼承_子類繼承父類繼承
- JS原型繼承和類式繼承JS原型繼承
- 類的繼承繼承
- javascript類繼承JavaScript繼承
- python3 筆記20.類的呼叫和多重繼承(多重繼承MRO方法解析順序)Python筆記繼承
- TypeScript 介面繼承類TypeScript繼承
- 原型繼承:子類原型繼承
- C++ | 類繼承C++繼承
- iOS 繼承&類方法iOS繼承
- Java:類與繼承Java繼承
- 繼承 基類與派生類繼承
- Java類是如何預設繼承Object的?Java繼承Object
- Python類的繼承Python繼承
- 繼承+多型+抽象類繼承多型抽象
- 類的繼承圖解繼承圖解
- Java的類與繼承Java繼承
- Swift—類的繼承-備Swift繼承
- 類的繼承和派生繼承
- es5繼承和es6類和繼承繼承
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 從本質認識JavaScript的原型繼承和類繼承JavaScript原型繼承
- PHP 抽象類繼承抽象類時的注意點PHP 抽象類繼承抽象類時的注意點PHP抽象繼承
- 如何判斷一個類是從另一個類繼承繼承
- 物件、原型鏈、類、繼承【上】物件原型繼承
- Java之繼承和抽象類Java繼承抽象
- ES6 - 類與繼承繼承
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- JavaScript基礎: 類與繼承JavaScript繼承
- [C++]繼承和派生類C++繼承
- Qt類繼承關係圖QT繼承
- 模板類的繼承問題繼承
- C#中類的繼承C#繼承
- JAVA介面繼承、抽象類等Java繼承抽象
- 繼承 重寫和抽象類繼承抽象
- JavaSE-繼承(包含Object類)Java繼承Object
- 菱形繼承與虛基類繼承