1. 程式人生 > >[Python3] 022 面向對象 第二彈

[Python3] 022 面向對象 第二彈

學院 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 的優點

接上一篇 [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 面向對象 第二彈