第7.19節 Python中的抽象類詳解:abstractmethod、abc與真實子類
一、 引言
前面相關的章節已經介紹過,Python中定義某種類型是以實現了該類型對應的協議為標准的,而不是以繼承關系為標准,在各種調用中,不會顯式地指定對象必須包含哪些方法才能用作參數,而是假設所有對象都能完成其工作,在執行時去調用特定協議的方法來執行,因此Python並不推薦在代碼中去進行類型檢查和屬性檢查。但為了提供一種可以要求實現對象遵循對應協議、提供所有特定功能集的方法,Python提供了抽象類的機制。
二、 抽象類的作用
抽象類是不能(至少是不應該)實例化的類,其職責是定義子類應實現的一組抽象方法。抽象類不能實例化,從抽象類派生出一個子類,如果沒有重寫所有抽象方法,則這個類也是抽象的,不能實例化。
抽象類提供了邏輯和實現解耦的能力,即抽象類定義模塊提供的功能,在具體實現類來提供實現,這樣在不同的模塊中通過抽象類來調用,可以用最精簡的方式展示出代碼之間的邏輯關系,讓模塊之間的依賴清晰簡單。同時,一個抽象類可以有多個實現,讓系統的運轉更加靈活。而針對抽象類的編程,讓每個人可以關注當前抽象類,只關注其方法和描述,而不需要考慮過多的其他邏輯,這對協同開發有很大意義。極簡版的抽象類實現,也讓代碼可讀性更高。
三、 Python抽象類的實現
Python為了實現抽象類的支持,支持定義抽象基類(Abstract Base Class),Python使用模塊abc提供了抽象基類的支撐能力。抽象基類用於指定子類必須提供哪些功能,卻不實現這些功能。抽象基類提供基本類和最基本的抽象方法,可以為子類定義共有的方法,但不需要具體實現。
Python的抽象基類使用有兩種方式:真實子類和虛擬子類,本節先介紹真實子類相關的內容,后面章節再介紹虛擬子類。
真實子類就是子類直接從抽象基類派生,抽象基類中可以定義”抽象方法“和“抽象屬性”, 抽象基類可以不實現具體的方法,也可以實現部分,子類繼承抽象基類的抽象內容並實現,只有完全重寫了抽象基類中的“抽象”內容后,才能被實例化,如果有個抽象內容沒有重寫則子類本身也是抽象類,不能實例化。
四、 抽象基類實現的步驟
1. 導入abc模塊的抽象基類ABC和方法abstractmethod:
from abc import ABC, abstractmethod
2. 定義抽象基類:抽象基類要求從ABC類或其子類派生:
class 抽象基類名(ABC):
類體代碼
3. 使用abstractmethod裝飾器定義抽象方法或抽象屬性,類似於類方法定義:
@abstractmethod
def 抽象方法名(self):
抽象方法是子類必須實現的方法,否則子類無法定義。
抽象屬性的定義由於相關屬性定義的內容還未介紹,本節暫不進行介紹,后面章節再進行補充。
五、 抽象基類的使用
1. 定義子類時指定子類從抽象基類繼承;
2. 抽象方法或者抽象基類中定義的實例化方法都可通過super()調用機制來調用;
3. 抽象基類中定義的普通方法可以直接由子類繼承使用,其調用方式與普通的類繼承訪問父類的方法相同。不過老猿推薦使用“super().方法名()”的方式類訪問。
本節詳細介紹了Python抽象基類相關的概念、抽象基類定義的語法,下節將結合詳細的案例進行進一步介紹。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用於逐步介紹老猿學習Python后總結的學習經驗,這些經驗有助於沒有接觸過Python的程序員可以很容易地進入Python的世界。
歡迎大家批評指正,謝謝大家關注!