天天看點

10-面向對象三大特性

# 1. 面向對象的三大特性

  - 封裝

  - 繼承

  - 多态

# 2. 封裝

- 封裝就是對對象的成員進行通路限制

- 封裝的三個級别:

  - 公開,public

  - 受保護的,protected

  - 私有的,private

  - public,private,protected不是關鍵字

- 判别對象的位置

  - 對象内部

  - 對象外部

  - 子類中

- 私有

  - 私有成員是***别的封裝,隻能在目前類或對象中通路

  - 在成員前面添加兩個兩個下劃線即可

    class Person():

      # name是共有的成員

      name = "xiaoyuyu"

      # __age就是私有成員

      __age = 18

  - Python的私有不是真私有,是一種成為name mangling的改名政策

  可以使用對象._classname_attributename通路

- 受保護的封裝 protected

  - 受保護的封裝是将對象成員進行一定級别的封裝,然後,在類中或者子類中都

  可以進行通路,但是在外部不可以

  - 封裝方法: 在成員名稱前添加一個下劃線即可

- 公開的,公共的 public

  - 公共的封裝實際對成員沒有任何操作,任何地方都可以通路

# 3. 繼承

- 繼承就是一個類可以獲得另外一個類中的成員屬性和成員方法

- 作用: 減少代碼,增加代碼的複用功能, 同時可以設定類與類直接的關系

- 繼承與被繼承的概念:

  - 被繼承的類叫父類,也叫基類,也叫超類

  - 用于繼承的類,叫子類,也叫派生類

  - 繼承與被繼承一定存在一個 is-a 關系

- 繼承的特征

  - 所有的類都繼承自object類,即所有的類都是object類的子類

  - 子類一旦繼承父類,則可以使用父類中除私有成員外的所有内容

  - 子類繼承父類後并沒有将父類成員完全指派到子類中,而是通過引用關系通路調用

  - 子類中可以定義獨有的成員屬性和方法

  - 子類中定義的成員和父類成員如果相同,則優先使用子類成員

  - 子類如果想擴充父類的方法,可以在定義新方法的同時通路父類成員來進行代碼重用,

  可以使用 [父類名.父類成員] 的格式來調用父類成員,也可以使用super().父類成員的

  格式來調用

- 繼承變量函數的查找順序問題

  - 優先查找自己的變量

  - 沒有則查找父類

  - 構造函數如果本類中沒有定義,則自動查找調用父類構造函數

  - 如果本類有定義,則不在繼續向上查找

- 構造函數

  - 是一類特殊的函數,在類進行執行個體化之前進行調用

  - 如果定義了構造函數,則執行個體化時使用構造函數,不查找父類構造函數

  - 如果沒定義,則自動查找父類構造函數

  - 如果子類沒定義,父類的構造函數帶參數,則構造對象時的參數應該按父類參數構造

- super

  - super不是關鍵字, 而是一個類

  - super的作用是擷取MRO(MethodResolustionOrder)清單中的第一個類

  - super于父類直接沒任何實質性關系,但通過super可以調用到父類

  - super使用兩個方,參見在構造函數中調用父類的構造函數

- 單繼承和多繼承

  - 單繼承:每個類隻能繼承一個類

  - 多繼承,每個類允許繼承多個類

- 單繼承和多繼承的優缺點

  - 單繼承:

    - 傳承有序邏輯清晰文法簡單隐患少呀

    - 功能不能無限擴充,隻能在目前唯一的繼承鍊中擴充

  - 多繼承:

    - 優點:類的功能擴充友善

    - 缺點:繼承關系混亂

- 菱形繼承/鑽石繼承問題

  - 多個子類繼承自同一個父類,這些子類由被同一個類繼承,于是繼承關系圖形成一個菱形圖譜

  - [MRO](https://www.cnblogs.com/whatisfantasy/p/6046991.html)

  - 關于多繼承的MRO

    - MRO就是多繼承中,用于儲存繼承順序的一個清單

    - python本身采用C3算法來多多繼承的菱形繼承進行計算的結果

  - MRO清單的計算原則:

    - 子類永遠在父類前面

    - 如果多個父類,則根據繼承文法中括号内類的書寫順序存放

    - 如果多個類繼承了同一個父類,孫子類中隻會選取繼承文法括号中第一個父類的父類

- 構造函數

  - 在對象進行執行個體化的時候,系統自動調用的一個函數叫構造函數,通常此函數用來對執行個體對象進行初始化,顧名

  - 構造函數一定要有,如果沒有,則自動向上查找,按照MRO順序,直到找到為止

# 4. 多态

- 多态就是同一個對象在不同情況下有不同的狀态出現

- 多态不是文法,是一種設計思想

- 多态性: 一種調用方式,不同的執行效果

- 多态: 同一事物的多種形态,動物分為人類,狗類,豬類

- [多态和多态性](https://www.cnblogs.com/luchuangao/p/6739557.html)

- Mixin設計模式

  - 主要采用多繼承方式對類的功能進行擴充

  - [Mixin概念](https://www.zhihu.com/question/20778853)

  - [MRO and Mixin](http://blog.csdn.net/robinjwong/article/details/48375833)

  - [Mixin模式](https://www.cnblogs.com/xybaby/p/6484262.html)

  - [Mixin MRO](http://runforever.github.io/2014-07-19/2014-07-19-python-mixin%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/)

  - [MRO](http://xiaocong.github.io/blog/2012/06/13/python-mixin-and-mro/)

- 我們使用多繼承文法來實作Minxin

- 使用Mixin實作多繼承的時候非常小心

  - 首先他必須表示某一單一功能,而不是某個物品

  - 職責必須單一,如果由多個功能,則寫多個Mixin

  - Mixin不能依賴于子類的實作

  - 子類及時沒有繼承這個Mixin類, 也能照樣工作,隻是缺少了某個功能

- 優點

  - 使用Mixin可以在不對類進行任何修改的情況下,擴充功能

  - 可以友善的組織和維護不同功能元件的劃分

  - 可以根據需要任意調整功能類的組合

  - 可以避免建立很多新的類,導緻類的繼承混亂