Python面向對象之繼承原理與用法案例分析
本文實例講述了Python面向對象之繼承原理與用法。分享給大家供大家參考,具體如下:
目標
單繼承
多繼承
面向對象三大特性
封裝 根據(jù) 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中
繼承 實現(xiàn)代碼的重用,相同的代碼不需要重復的編寫
多態(tài) 不同的對象調(diào)用相同的方法,產(chǎn)生不同的執(zhí)行結果,增加代碼的靈活度
01. 單繼承
1.1 繼承的概念、語法和特點
繼承的概念:子類 擁有 父類 的所有 方法 和 屬性
- 繼承的語法
class 類名(父類名): pass
子類 繼承自 父類,可以直接 享受 父類中已經(jīng)封裝好的方法,不需要再次開發(fā)
子類 中應該根據(jù) 職責,封裝 子類特有的 屬性和方法
2) 專業(yè)術語
Dog 類是 Animal 類的子類,Animal 類是 Dog 類的父類,Dog 類從 Animal 類繼承
Dog 類是 Animal 類的派生類,Animal 類是 Dog 類的基類,Dog 類從 Animal 類派生
3) 繼承的傳遞性
C 類從 B 類繼承,B 類又從 A 類繼承
那么 C 類就具有 B 類和 A 類的所有屬性和方法
子類 擁有 父類 以及 父類的父類 中封裝的所有 屬性 和 方法
提問
哮天犬 能夠調(diào)用 Cat 類中定義的 catch 方法嗎?
答案
不能,因為 哮天犬 和 Cat 之間沒有 繼承 關系
1.2 方法的重寫
子類 擁有 父類 的所有 方法 和 屬性
子類 繼承自 父類,可以直接 享受 父類中已經(jīng)封裝好的方法,不需要再次開發(fā)
應用場景
當 父類 的方法實現(xiàn)不能滿足子類需求時,可以對方法進行 重寫(override)
重寫 父類方法有兩種情況:
覆蓋 父類的方法
對父類方法進行 擴展
- 覆蓋父類的方法
如果在開發(fā)中,父類的方法實現(xiàn) 和 子類的方法實現(xiàn),完全不同
就可以使用 覆蓋 的方式,在子類中 重新編寫 父類的方法實現(xiàn)
具體的實現(xiàn)方式,就相當于在 子類中 定義了一個 和父類同名的方法并且實現(xiàn)
重寫之后,在運行時,只會調(diào)用 子類中重寫的方法,而不再會調(diào)用 父類封裝的方法
- 對父類方法進行 擴展
如果在開發(fā)中,子類的方法實現(xiàn) 中 包含 父類的方法實現(xiàn)
父類原本封裝的方法實現(xiàn) 是 子類方法的一部分
就可以使用 擴展 的方式
在子類中 重寫 父類的方法
在需要的位置使用 super().父類方法 來調(diào)用父類方法的執(zhí)行
代碼其他的位置針對子類的需求,編寫 子類特有的代碼實現(xiàn)
關于 super
在 Python 中 super 是一個 特殊的類
super() 就是使用 super 類創(chuàng)建出來的對象
最常 使用的場景就是在 重寫父類方法時,調(diào)用 在父類中封裝的方法實現(xiàn)
調(diào)用父類方法的另外一種方式(知道)
在 Python 2.x 時,如果需要調(diào)用父類的方法,還可以使用以下方式:
父類名.方法(self)
這種方式,目前在 Python 3.x 還支持這種方式
這種方法 不推薦使用,因為一旦 父類發(fā)生變化,方法調(diào)用位置的 類名 同樣需要修改
提示
在開發(fā)時,父類名 和 super() 兩種方式不要混用
如果使用 當前子類名 調(diào)用方法,會形成遞歸調(diào)用,出現(xiàn)死循環(huán)
1.3 父類的 私有屬性 和 私有方法
子類對象 不能 在自己的方法內(nèi)部,直接 訪問 父類的 私有屬性 或 私有方法
子類對象 可以通過 父類 的 公有方法 間接 訪問到 私有屬性 或 私有方法
私有屬性、方法 是對象的隱私,不對外公開,外界 以及 子類 都不能直接訪問
私有屬性、方法 通常用于做一些內(nèi)部的事情
示例
B 的對象不能直接訪問 __num2 屬性
B 的對象不能在 demo 方法內(nèi)訪問 __num2 屬性
B 的對象可以在 demo 方法內(nèi),調(diào)用父類的 test 方法
父類的 test 方法內(nèi)部,能夠訪問 __num2 屬性和 __test 方法
02. 多繼承
概念
子類 可以擁有 多個父類,并且具有 所有父類 的 屬性 和 方法
例如:孩子 會繼承自己 父親 和 母親 的 特性
語法
class 子類名(父類名1, 父類名2...) pass
2.1 多繼承的使用注意事項
問題的提出
如果 不同的父類 中存在 同名的方法,子類對象 在調(diào)用方法時,會調(diào)用 哪一個父類中的方法呢?
提示:開發(fā)時,應該盡量避免這種容易產(chǎn)生混淆的情況! —— 如果 父類之間 存在 同名的屬性或者方法,應該 盡量避免 使用多繼承
Python 中的 MRO —— 方法搜索順序(知道)
Python 中針對 類 提供了一個 內(nèi)置屬性 mro 可以查看 方法 搜索順序
MRO 是 method resolution order,主要用于 在多繼承時判斷 方法、屬性 的調(diào)用 路徑
print(C.__mro__)
輸出結果
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
在搜索方法時,是按照 mro 的輸出結果 從左至右 的順序查找的
如果在當前類中 找到方法,就直接執(zhí)行,不再搜索
如果 沒有找到,就查找下一個類 中是否有對應的方法,如果找到,就直接執(zhí)行,不再搜索
如果找到最后一個類,還沒有找到方法,程序報錯
2.2 新式類與舊式(經(jīng)典)類
object 是 Python 為所有對象提供的 基類,提供有一些內(nèi)置的屬性和方法,可以使用 dir 函數(shù)查看
新式類:以 object 為基類的類,推薦使用
經(jīng)典類:不以 object 為基類的類,不推薦使用
在 Python 3.x 中定義類時,如果沒有指定父類,會 默認使用 object 作為該類的 基類 —— Python 3.x 中定義的類都是 新式類
在 Python 2.x 中定義類時,如果沒有指定父類,則不會以 object 作為 基類
新式類 和 經(jīng)典類 在多繼承時 —— 會影響到方法的搜索順序
為了保證編寫的代碼能夠同時在 Python 2.x 和 Python 3.x 運行!
今后在定義類時,如果沒有父類,建議統(tǒng)一繼承自 object
class 類名(object): pass
更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設計有所幫助。
- python面向對象之類的繼承詳解
- Python面向對象封裝繼承和多態(tài)示例講解
- Python面向對象程序設計之繼承、多態(tài)原理與用法詳解
- Python 面向對象之封裝、繼承、多態(tài)操作實例分析
- Python面向對象之繼承和多態(tài)用法分析
- Python3.5面向對象程序設計之類的繼承和多態(tài)詳解
- Python3.5面向對象與繼承圖文實例詳解
- Python面向對象程序設計類的封裝與繼承用法示例
- Python面向對象程序設計多繼承和多態(tài)用法示例
- Python面向對象程序設計之類的定義與繼承簡單示例
- Python面向對象之類的定義與繼承用法示例
- Python面向對象類編寫細節(jié)分析【類,方法,繼承,超類,接口等】
- Python面向對象程序設計OOP入門教程【類,實例,繼承,重載等】
- Python面向對象之繼承和組合用法實例分析
- Python面向對象程序設計之繼承與多繼承用法分析
- Python面向對象類的繼承實例詳解
- Python面向對象類繼承和組合實例分析
- Python 面向對象編程的三大特性之繼承
相關文章
Python+OpenCV實現(xiàn)閾值分割的方法詳解
閾值分割法是一種基于區(qū)域的圖像分割技術,原理是把圖像像素點分為若干類。本文將利用Python+OpenCV實現(xiàn)閾值分割,感興趣的可以了解一下2022-05-05Python 根據(jù)日志級別打印不同顏色的日志的方法示例
這篇文章主要介紹了Python 根據(jù)日志級別打印不同顏色的日志的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08Flask框架通過Flask_login實現(xiàn)用戶登錄功能示例
這篇文章主要介紹了Flask框架通過Flask_login實現(xiàn)用戶登錄功能,結合實例形式較為詳細的分析了flask框架使用Flask_login實現(xiàn)用戶登陸功能的具體操作步驟、相關實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2018-07-07Python+matplotlib調(diào)用隨機函數(shù)生成變化圖形
這篇文章主要介紹了如何在Python中利用隨機函數(shù)生成變化的圖形,文中的示例代碼講解詳細,對我們學習有一定吧參考價值,需要的可以了解一下2022-04-04