Python 面向?qū)ο?- 03 繼承和方法的重寫

????.jpg

目錄
一、單繼承
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 繼承的概念

繼承的概念子類 擁有 父類 的所有 方法屬性

圖片.png

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)子類方法的一部分
  • 就可以使用 擴展 的方式
    1. 在子類中 重寫 父類的方法
    2. 在需要的位置使用 super().父類方法 來調(diào)用父類方法的執(zhí)行
    3. 代碼其他的位置針對子類的需求,編寫 子類特有的代碼實現(xiàn)
關(guān)于 super
  • Pythonsuper 是一個 特殊的類
  • 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 父類的私有屬性和私有方法

  1. 子類對象 不能 在自己的方法內(nèi)部,直接 訪問 父類的 私有屬性私有方法
  2. 子類對象 可以通過 父類公有方法 間接 訪問到 私有屬性私有方法
  • 私有屬性、方法 是對象的隱私,不對外公開,外界 以及 子類 都不能直接訪問
  • 私有屬性、方法 通常用于做一些內(nèi)部的事情

示例

父類的私有屬性和私有方法.png

  • 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)用 哪一個父類中的方法呢?

多繼承II .png

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)典)類

objectPython 為所有對象提供的 基類,提供有一些內(nèi)置的屬性和方法,可以使用 dir 函數(shù)查看

  • 新式類:以 object 為基類的類,推薦使用

  • 經(jīng)典類:不以 object 為基類的類,不推薦使用

  • Python 3.x 中定義類時,如果沒有指定父類,會 默認使用 object 作為該類的 基類 —— Python 3.x 中定義的類都是 新式類

  • Python 2.x 中定義類時,如果沒有指定父類,則不會以 object 作為 基類

新式類經(jīng)典類 在多繼承時 —— 會影響到方法的搜索順序

為了保證編寫的代碼能夠同時在 Python 2.xPython 3.x 運行!
今后在定義類時,如果沒有父類,建議統(tǒng)一繼承自 object

class 類名(object):
     pass
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容