Python面向對象編程之封裝、繼承、多態(基礎篇九)

面向對象編程

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. 將屬性和方法放到一起做爲一個整體,然後通過實例化對象來處理;
  2. 隱藏內部實現細節,只需要和對象及其屬性和方法交互就可以了;
  3. 對類的屬性和方法增加 訪問權限控制。

<1> 私有權限:在屬性名和方法名 前面 加上兩個下劃線 __

  1. 類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內部訪問;
  2. 類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;
  3. 私有屬性 和 私有方法 往往用來處理類的內部事情,不通過對象處理,起到安全作用。

總結:

  • Python中沒有像C++中 public 和 private 這些關鍵字來區別公有屬性和私有屬性。
  • Python是以屬性命名方式來區分,如果在屬性和方法名前面加了2個下劃線’__’,則表明該屬性和方法是私有權限,否則爲公有權限。

<2> 修改私有屬性

  • 如果需要修改一個對象的屬性值,通常有2種方法

    1. 對象名.屬性名 = 數據 ----> 直接修改
    2. 對象名.方法名() ----> 間接修改
  • 私有屬性不能直接訪問,所以無法通過第一種方式修改,一般的通過第二種方式修改私有屬性的值:定義一個可以調用的公有方法,在這個公有方法內訪問修改。

6 多態

  • 封裝 , 這是定義類的 準則,單個類
    • 根據 職責 將 屬性 和 方法 封裝 到一個抽象的 類 中,
  • 繼承 , 這是設計類的 技巧,父與子
    • 主要體現是實現代碼的 重用,相同的代碼不需要重複的編寫
    • 子類可以在父類功能上進行重寫,擴展類的功能
  • 多態, 不同的 子類對象調用 相同的 父類方法,產生 不同的 執行結果,可以增加代碼的外部 調用靈活度
    • 多態以 繼承 和 重寫 父類方法 爲前提
    • 多態是調用方法的技巧,不會影響到類的內部設計

最終效果

  • Person 類中只需要調用 Dog 對象 work() 方法,而不關心具體是 什麼狗
  • work() 方法是在 Dog 父類中定義的,子類重寫並處理不同方式的實現
  • 在程序執行時,傳入不同的 Dog 對象作爲實參,就會產生不同的執行效果

多態總結

  • 定義:多態是一種使用對象的方式,子類重寫父類方法,調用不同子類對象的相同父類方法,可以產生不同的執行結果
  • 好處:調用靈活,有了多態,更容易編寫出通用的代碼,做出通用的編程,以適應需求的不斷變化!

7 類屬性和和實例屬性

<1> 類屬性

通過類創建的對象 又稱爲 實例對象對象屬性 又稱爲 實例屬性,記錄對象各自的數據,不同對象的同名實例屬性,記錄的數據可能各不相同

類屬性使用場景:

  • 類的實例 記錄的某項數據 始終保持一致時,則定義類屬性。
  • 實例屬性 要求 每個對象 爲其 單獨開闢一份內存空間 來記錄數據,而 類屬性 爲全類所共有 ,僅佔用一份內存更加節省內存空間

總結:

  • 儘量避免類屬性和對象屬性同名。如果有同名對象屬性,實例對象會優先訪問對象屬性
  • 類屬性只能通過類對象修改,不能通過實例對象修改
  • 類屬性也可以設置爲 私有,前邊添加兩個下劃線

<2> 實例屬性

類屬性就是 類對象 所擁有的屬性,它被 該類的所有實例對象 所共有

類屬性可以使用 類對象實例對象 訪問

8 類方法和靜態方法

<1> 類方法

  • 類對象所擁有的方法
  • 需要用裝飾器@classmethod來標識其爲類方法,對於類方法,第一個參數必須是類對象,一般以cls作爲第一個參數。

使用場景:

  • 當方法中 需要使用類對象 (如訪問私有類屬性等)時,定義類方法
  • 類方法一般和類屬性配合使用

<2> 靜態方法

  • 需要通過裝飾器@staticmethod來進行修飾,靜態方法既不需要傳遞類對象也不需要傳遞實例對象(形參沒有self/cls)
  • 靜態方法 也能夠通過 實例對象類對象 去訪問。

使用場景:

  • 當方法中 既不需要使用實例對象(如實例對象,實例屬性),也不需要使用類對象 (如類屬性、類方法、創建實例等)時,定義靜態方法
  • 取消不需要的參數傳遞,有利於 減少不必要的內存佔用和性能消耗

注意點:

  • 類中定義了同名的對象方法、類方法、靜態方法時,調用方法會優先執行最後定義的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章