python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承的情况?...
是否建議它也適用于構造函數?我主要考慮Python及其__init __()方法,但這個問題適用于任何具有繼承的面向對象語言.
我問這個問題,因為有一個子類從一個或多個類繼承,提供一些不錯的默認行為(比如從Python繼承字典,以便obj [‘key’]適用于新的對象)類).但是,允許子類完全像字典一樣使用并不總是自然或簡單的:有時候構造函數參數只與特定用戶子類相關(例如,代表一組串行端口的類)更好可能希望表現得像端口[‘usb1’]是USB端口#1等字典.這種情況的推薦方法是什么?具有與其基類完全兼容的子類構造函數,并通過對象工廠函數生成實例,該函數采用簡單,用戶友好的參數?或者只是編寫一個類構造函數,其參數集不能直接賦予其基類的構造函數,但從用戶角度來看哪個更合乎邏輯?
PS:我誤解了上面的Liskov原則:下面的Sven的評論指出了一個子類的對象應該像超類的對象一樣的事實(子類本身不必像超類一樣;特別是,它們的構造函數沒有具有相同的參數[簽名]).
解決方法:
根據要求,我發布了以前作為評論的回答.
鏈接的維基百科文章中定義的原則是“如果S是T的子類型,那么類型T的對象可以用類型S的對象替換”.它不會讀取“子類應該以與其基類相同的方式運行”.在考慮構造函數時,差異很重要:維基百科版本僅討論子類型的對象,而不是類型本身.對于一個對象,已經調用了構造函數,因此該原則不適用于構造函數.這也是我應用它的方式,以及它在標準庫中的應用方式(例如defaultdict和dict).
多重繼承中的構造函數可能無法以語言無關的方式進行討論.在Python中,有兩種方法.如果您的繼承圖包含菱形圖案,并且您需要確保所有構造函數只被調用一次,則應使用super()并遵循Raymond Hettinger的文章Python’s super() considered super“實用建議”部分中描述的模式.如果您沒有鉆石(包括對象的鉆石除外),您還可以對所有基類構造函數使用顯式基類調用.
標簽:python,oop,constructor,liskov-substitution-principle
總結
以上是生活随笔為你收集整理的python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承的情况?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树莓派是python的应用领域吗_树莓派
- 下一篇: 深度学习 占用gpu内存 使用率为0_你