
目錄
一、單繼承
1.1 繼承的概念
1.2 繼承的語法
二、方法的重寫
2.1 應(yīng)用場景
2.2 覆蓋父類的方法
2.3 對父類方法進行擴展
2.4 父類的私有屬性和私有方法
三、多繼承
3.1 多繼承的概念
3.2 多繼承的語法
3.3 多繼承的使用注意事項
3.4 新式類與舊式(經(jīng)典)類
一、單繼承
1.1 繼承的概念
繼承的概念:子類 擁有 父類 的所有 方法 和 屬性

1.2 繼承的語法
class 類名(父類名):
pass
- 子類 繼承自 父類,可以直接 享受 父類中已經(jīng)封裝好的方法,不需要再次開發(fā)
- 子類 中應(yīng)該根據(jù) 職責,封裝 子類特有的 屬性和方法
二、方法的重寫
- 子類 擁有 父類 的所有 方法 和 屬性
- 子類 繼承自 父類,可以直接 享受 父類中已經(jīng)封裝好的方法,不需要再次開發(fā)
2.1 應(yīng)用場景
- 當 父類 的方法實現(xiàn)不能滿足子類需求時,可以對方法進行 重寫(override)
圖片.png
2.2 覆蓋父類的方法
- 如果在開發(fā)中,父類的方法實現(xiàn) 和 子類的方法實現(xiàn),完全不同
- 就可以使用 覆蓋 的方式,在子類中 重新編寫 父類的方法實現(xiàn)
- 重寫之后,在運行時,只會調(diào)用 子類中重寫的方法,而不再會調(diào)用 父類封裝的方法
2.3 對父類方法進行擴展
- 如果在開發(fā)中,子類的方法實現(xiàn) 中 包含 父類的方法實現(xiàn)
- 父類原本封裝的方法實現(xiàn) 是 子類方法的一部分
- 就可以使用 擴展 的方式
- 在子類中 重寫 父類的方法
- 在需要的位置使用
super().父類方法來調(diào)用父類方法的執(zhí)行 - 代碼其他的位置針對子類的需求,編寫 子類特有的代碼實現(xiàn)
關(guā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)
2.4 父類的私有屬性和私有方法
- 子類對象 不能 在自己的方法內(nèi)部,直接 訪問 父類的 私有屬性 或 私有方法
- 子類對象 可以通過 父類 的 公有方法 間接 訪問到 私有屬性 或 私有方法
- 私有屬性、方法 是對象的隱私,不對外公開,外界 以及 子類 都不能直接訪問
- 私有屬性、方法 通常用于做一些內(nèi)部的事情
示例

-
B的對象不能直接訪問__num2屬性 -
B的對象不能在demo方法內(nèi)訪問__num2屬性 -
B的對象可以在demo方法內(nèi),調(diào)用父類的test方法 - 父類的
test方法內(nèi)部,能夠訪問__num2屬性和__test方法
三、多繼承
3.1 多繼承的概念
- 子類 可以擁有 多個父類,并且具有 所有父類 的 屬性 和 方法
- 例如:孩子 會繼承自己 父親 和 母親 的 特性
多繼承.png
3.2 多繼承的語法
class 子類名(父類名1, 父類名2...)
pass
3.3 多繼承的使用注意事項
如果 不同的父類 中存在 同名的方法,子類對象 在調(diào)用方法時,會調(diào)用 哪一個父類中的方法呢?

Python 中的 MRO —— 方法搜索順序(知道)
Python中針對 類 提供了一個 內(nèi)置屬性__mro__可以查看 方法 搜索順序-
MRO 是
method resolution order,主要用于 在多繼承時判斷 方法、屬性 的調(diào)用 路徑print(C.mro)
輸出結(jié)果
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
- 在搜索方法時,是按照
__mro__的輸出結(jié)果 從左至右 的順序查找的 - 如果在當前類中 找到方法,就直接執(zhí)行,不再搜索
- 如果 沒有找到,就查找下一個類 中是否有對應(yīng)的方法,如果找到,就直接執(zhí)行,不再搜索
- 如果找到最后一個類,還沒有找到方法,程序報錯
使用注意:開發(fā)時,應(yīng)該盡量避免這種容易產(chǎn)生混淆的情況! —— 如果父類之間存在同名的屬性或者方法,應(yīng)該盡量避免使用多繼承
3.4 新式類與舊式(經(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

