[Python3] 022 面向對象 第二彈
阿新 • • 發佈:2019-04-07
學院 blank htm 復用 () 簡單 不同 相同 center
目錄
- 6. 面向對象的三大特性
- 6.1 封裝
- 6.1.1 私有 private
- 6.1.2 受保護 protected
- 6.1.3 公開 public
- 6.2 繼承
- 6.2.1 繼承的概念與作用
- 6.2.2 繼承與被繼承
- 6.2.3 繼承的特征
- 6.2.4 繼承的查找順序問題
- 6.2.5 super
- 6.2.6 單繼承與多繼承
- 6.2.7 菱形繼承(鉆石繼承)問題
- 6.2.8 構造函數
- 6.3 多態
- 6.3.1 多態的概念
- 6.3.2 多態與多態性
- 6.3.3 Mixin 設計模式
- 6.3.4 Mixin 的優點
- 6.1 封裝
接上一篇 [Python3] 021 面向對象 第一彈
6. 面向對象的三大特性
- 封裝
- 繼承
- 多態
6.1 封裝
- 封裝就是對對象的成員進行訪問限制
- 封裝的三個級別:
- 私有,private
- 受保護,protected
- 公開,public
public,private,protected 不是關鍵字
- 判別對象的位置
- 對象內部
- 對象外部
- 子類中
6.1.1 私有 private
- 私有成員是最高級別的封裝,只能在當前類或對象中訪問
- 在成員前面添加兩個兩個下劃線即可
class Person():
# name 是共有的成員
name = "YorkFish"
# __age 是私有成員
__age = 18
- Python 的私有不是真私有,是一種稱為 name mangling 的改名策略
- 可以使用 "對象._classname__attributename" 訪問,如
p = Person() print(p._Person__age)
6.1.2 受保護 protected
- 受保護的封裝是將對象成員進行一定級別的封裝
- 在類中或者子類中都可以進行訪問
- 在外部不可以
- 封裝方法: 在成員名稱前添加一個下劃線即可
- 如,_sum
6.1.3 公開 public
- 公共的封裝實際對成員沒有任何操作,任何地方都可以訪問
6.2 繼承
6.2.1 繼承的概念與作用
- 概念
- 使一個類可以獲得另一個類中的成員屬性和成員方法
- 作用
- 減少代碼量
- 增加代碼復用
- 可以設置類與類直接的關系
6.2.2 繼承與被繼承
- 概念:
- 用於繼承的類,叫子類,也叫派生類
- 被繼承的類叫父類,也叫基類,也叫超類
- 繼承與被繼承一定存在一個 is-a 關系
6.2.3 繼承的特征
- 所有的類都繼承自 object 類,即,所有的類都是 object 類的子類
- 子類一旦繼承父類,就可以使用父類中除私有成員外的所有內容
- 子類繼承父類後並沒有將父類成員完全賦值到子類中,而是通過引用關系訪問調用
- 子類中可以定義獨有的成員屬性和方法
- 子類中定義的成員和父類成員如果相同,則優先使用子類成員
- 子類如果想擴充父類的方法
- 可以在定義新方法的同時訪問父類成員來進行代碼重用
- 可以使用 “父類名.父類成員” 的格式來調用父類成員
- 也可以使用 “super().父類成員”的格式來調用
- 可以在定義新方法的同時訪問父類成員來進行代碼重用
6.2.4 繼承的查找順序問題
- 優先查找自己的變量
- 如果本類有定義,則不在繼續向上查找
- 沒有則查找父類
- 如果本類中的“構造函數”沒有定義,則自動查找調用父類的“構造函數”
- ps: 嚴格來說,上方說的“構造函數” (def init(): ...) 並非真正意義上的“構造函數”
- 它是一類特殊的函數,在類進行實例化之前進行調用
- 如果定義了“構造函數”,則實例化時使用“構造函數”,不查找父類“構造函數”
- 如果沒定義,則自動查找父類“構造函數”
- 如果子類沒定義,且父類的“構造函數”帶參數,則構造對象時的參數應該按父類參數構造
- 6.2.8 有補充
6.2.5 super
- super 不是關鍵字, 而是一個類
- super 的作用是獲取 MRO (MethodResolustionOrder) 列表中的第一個類
- super 於父類之間沒任何實質性關系,但通過 super 可以調用到父類
- super 能繼承並調用父類的方法
6.2.6 單繼承與多繼承
- 單繼承:每個類只能繼承一個類
多繼承:每個類允許繼承多個類
- 單繼承的優缺點
- 優點:傳承有序,邏輯清晰,語法簡單,隱患少
- 缺點:功能不能無限擴展,只能在當前唯一的繼承鏈中擴展
- 多繼承的優缺點
- 優點:類的功能擴展方便
- 缺點:繼承關系混亂
6.2.7 菱形繼承(鉆石繼承)問題
- 多個子類繼承自同一個父類,這些子類由被同一個類繼承,於是繼承關系圖形成一個菱形圖譜
- 關於多繼承的 MRO
- MRO 就是多繼承中用於保存繼承順序的一個列表
- python 本身采用 C3 算法來計算多繼承的菱形繼承的順序
- MRO 列表的計算原則:
- 子類永遠在父類前面
- 如果多個父類,則根據繼承語法中括號內類的書寫順序存放
- 如果多個類繼承了同一個父類,“孫子類”中只會選取繼承語法括號中第一個父類的父類
6.2.8 構造函數
- 在對象進行實例化的時候,系統自動調用的一個函數叫構造函數
- 通常,此函數用來對實例對象進行初始化
- 構造函數一定要有
- 如果沒有,則自動向上查找
- 按照 MRO 順序,直到找到為止
6.3 多態
6.3.1 多態的概念
- 同一個對象在不同情況下有不同的狀態
- 多態不是語法,是一種設計思想
6.3.2 多態與多態性
術語 | 釋義 |
---|---|
多態 | 同一事物的多種形態 |
多態性 | 一種調用方式,不同的執行效果 |
6.3.3 Mixin 設計模式
- 主要采用多繼承方式對類的功能進行擴展
- 使用多繼承語法來實現 Minxin
- 使用 Mixin 實現多繼承的時候需非常小心
- 首先,它必須表示某一單一功能,而不是某個物品
- 其次,職責必須單一,如果有多個功能,則寫多個 Mixin
- Mixin 不能依賴於子類的實現
- 子類及時沒有繼承這個 Mixin 類, 也能照樣工作,只是缺少了某個功能
6.3.4 Mixin 的優點
- 使用 Mixin 可以在不對類進行任何修改的情況下,擴充功能
- 可以方便地組織和維護不同功能組件的劃分
- 可以根據需要任意調整功能類的組合
- 可以避免創建很多新的類,導致類的繼承混亂
此為聽 北京圖靈學院的 Python3 公開課 所記筆記
[Python3] 022 面向對象 第二彈