面向對象編程
1 單繼承
<1> 繼承的概念
- 現實中的繼承
在現實生活中,繼承一般指的是子女繼承父輩的財產
- 程序中的繼承
小總結:
- 在程序中,繼承描述的是多個類之間的所屬關係。
- 如果一個類A裏面的屬性和方法可以複用,則可以通過繼承的方式,傳遞到類B裏。
- 那麼類A就是基類,也叫做父類;類B就是派生類,也叫做子類
<2> 單繼承
子類只有一個父類
小總結:
-
雖然子類沒有定義
__init__
方法初始化屬性,也沒有定義實例方法,但是父類有。所以只要創建子類的對象,就默認執行了那個繼承過來的__init__
方法 -
子類在繼承的時候,在定義類時,小括號()中爲父類的名字
-
父類的屬性、方法,會被繼承給子類
2 多繼承
子類同時有多個父類
小總結:
- 多繼承可以繼承多個父類,也繼承了所有父類的屬性和方法
- 注意:如果多個父類中有同名的 屬性和方法,則默認使用第一個父類的屬性和方法(根據類的魔法屬性mro的順序來查找)
- 多個父類中,不重名的屬性和方法,不會有任何影響。
3 重寫方法
<1> 子類重寫父類的同名屬性和方法
<2> 子類調用父類的同名屬性和方法
<3> 使用super()調用父類方法
小總結:
-
子類繼承了多個父類,如果父類類名修改了,那麼子類也要涉及多次修改。而且需要重複寫多次調用,顯得代碼臃腫。
-
使用super() 可以逐一調用所有的父類方法,並且只執行一次。調用順序遵循 mro 類屬性的順序。
-
如果繼承了多個父類,且父類都有同名方法,則默認只執行第一個父類的(同名方法只執行一次,目前super()不支持執行多個父類的同名方法)**
-
super() 在Python2.3之後纔有的機制,用於通常單繼承的多層繼承。
4 多層繼承
5 私有屬性和私有方法
面向對象三大特性:封裝、繼承、多態
封裝的意義:
- 將屬性和方法放到一起做爲一個整體,然後通過實例化對象來處理;
- 隱藏內部實現細節,只需要和對象及其屬性和方法交互就可以了;
- 對類的屬性和方法增加 訪問權限控制。
<1> 私有權限:在屬性名和方法名 前面 加上兩個下劃線 __
- 類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內部訪問;
- 類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;
- 私有屬性 和 私有方法 往往用來處理類的內部事情,不通過對象處理,起到安全作用。
總結:
- Python中沒有像C++中 public 和 private 這些關鍵字來區別公有屬性和私有屬性。
- Python是以屬性命名方式來區分,如果在屬性和方法名前面加了2個下劃線’__’,則表明該屬性和方法是私有權限,否則爲公有權限。
<2> 修改私有屬性
-
如果需要修改一個對象的屬性值,通常有2種方法
- 對象名.屬性名 = 數據 ----> 直接修改
- 對象名.方法名() ----> 間接修改
-
私有屬性不能直接訪問,所以無法通過第一種方式修改,一般的通過第二種方式修改私有屬性的值:定義一個可以調用的公有方法,在這個公有方法內訪問修改。
6 多態
- 封裝 , 這是定義類的 準則,單個類
- 根據 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中,
- 繼承 , 這是設計類的 技巧,父與子
- 主要體現是實現代碼的 重用,相同的代碼不需要重複的編寫
- 子類可以在父類功能上進行重寫,擴展類的功能
- 多態, 不同的 子類對象調用 相同的 父類方法,產生 不同的 執行結果,可以增加代碼的外部 調用靈活度
- 多態以 繼承 和 重寫 父類方法 爲前提
- 多態是調用方法的技巧,不會影響到類的內部設計
最終效果
- Person 類中只需要調用 Dog 對象 work() 方法,而不關心具體是 什麼狗
- work() 方法是在 Dog 父類中定義的,子類重寫並處理不同方式的實現
- 在程序執行時,傳入不同的 Dog 對象作爲實參,就會產生不同的執行效果
多態總結
- 定義:多態是一種使用對象的方式,子類重寫父類方法,調用不同子類對象的相同父類方法,可以產生不同的執行結果
- 好處:調用靈活,有了多態,更容易編寫出通用的代碼,做出通用的編程,以適應需求的不斷變化!
7 類屬性和和實例屬性
<1> 類屬性
通過類創建的對象 又稱爲 實例對象,對象屬性 又稱爲 實例屬性,記錄對象各自的數據,不同對象的同名實例屬性,記錄的數據可能各不相同
類屬性使用場景:
- 類的實例 記錄的某項數據 始終保持一致時,則定義類屬性。
- 實例屬性 要求 每個對象 爲其 單獨開闢一份內存空間 來記錄數據,而 類屬性 爲全類所共有 ,僅佔用一份內存,更加節省內存空間
總結:
- 儘量避免類屬性和對象屬性同名。如果有同名對象屬性,實例對象會優先訪問對象屬性
- 類屬性只能通過類對象修改,不能通過實例對象修改
- 類屬性也可以設置爲 私有,前邊添加兩個下劃線
<2> 實例屬性
類屬性就是 類對象 所擁有的屬性,它被 該類的所有實例對象 所共有。
類屬性可以使用 類對象 或 實例對象 訪問
8 類方法和靜態方法
<1> 類方法
- 類對象所擁有的方法
- 需要用裝飾器
@classmethod
來標識其爲類方法,對於類方法,第一個參數必須是類對象,一般以cls
作爲第一個參數。
使用場景:
- 當方法中 需要使用類對象 (如訪問私有類屬性等)時,定義類方法
- 類方法一般和類屬性配合使用
<2> 靜態方法
- 需要通過裝飾器
@staticmethod
來進行修飾,靜態方法既不需要傳遞類對象也不需要傳遞實例對象(形參沒有self/cls)。 - 靜態方法 也能夠通過 實例對象 和 類對象 去訪問。
使用場景:
- 當方法中 既不需要使用實例對象(如實例對象,實例屬性),也不需要使用類對象 (如類屬性、類方法、創建實例等)時,定義靜態方法
- 取消不需要的參數傳遞,有利於 減少不必要的內存佔用和性能消耗
注意點:
- 類中定義了同名的對象方法、類方法、靜態方法時,調用方法會優先執行最後定義的方法