# 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可以在不對類進行任何修改的情況下,擴充功能
- 可以友善的組織和維護不同功能元件的劃分
- 可以根據需要任意調整功能類的組合
- 可以避免建立很多新的類,導緻類的繼承混亂