上一篇:Python 類與對象程式設計詳解五(特殊成員)
目錄
-
-
-
- 什麼是抽象類
- 為什麼要有抽象類
- 接口類
-
-
什麼是抽象類
抽象類描述了相關的一組類的通用的特征和行為。在客戶的應用程式中,抽象類是不能正常執行個體化的,它的子類叫做具體類,這表明它們才是真正用來在客戶應用程式中建立對象的類。
為什麼要有抽象類
如果說類是從一堆對象中抽取相同的内容而來的,那麼抽象類就是從一堆類中抽取相同的内容而來的,内容包括資料屬性和函數屬性。
從設計角度去看,如果類是從現實對象抽象而來的,那麼抽象類就是基于類抽象而來的。
從實作角度來看,抽象類與普通類的不同之處在于:抽象類中有抽象方法,該類不能被執行個體化,隻能被繼承,且子類必須實作抽象方法。這一點與接口有點類似,但其實是不同的,即将揭曉答案
執行個體:
import abc
class A(metaclass=abc.ABCMeta): # 指定元類
@abc.abstractmethod # 定義抽象方法,無需實作功能
def abstract_method(self):
"""子類必須定義該方法"""
pass
class B(A): # 子類繼承抽象類,必須定義抽象方法
def abstract_method(self):
print('抽象方法')
b = B()
b.abstract_method() # 抽象方法
運作結果:
抽象方法
接口類
首先要知道的就是,不管是接口類還是抽象類,都是一種設計模式,是面對對象開發規範
而這種設計模式是java提出來的,java還有很多類似的東西被其它程式設計語言沿用
接口類是java為了實作多繼承,設計的一個概念
python原生并沒有接口類這一概念,但是為了實作接口隔離原則,而劃分出來的
接口隔離原則:
使用多個專門的接口,而不使用單一的總接口,即用戶端不應該依賴那些不需要的接口
因為python天生能實作多繼承,是以并沒有接口類
應該算符合原則,強行區分出來這麼一類吧
執行個體:
# 接口類隻規定子類要實作哪些方法
# 抽象類比接口類多個屬性而已
Python 原生僅支援抽象類,不支援接口類
# 接口類
class Api(metaclass=ABCMeta):
@abstractmethod
def get(self):
print("33333")
@abstractmethod
def post(self):
print("222222222")
# 抽象類
class ApiClass(metaclass=ABCMeta):
name = "123" # 比接口類多一個name屬性,該屬性子類不是必需實作
@abstractmethod
def get(self):
pass
@abstractmethod
def post(self):
print("1111111111111")
# 普通類
class A(Api):
def get(self):
print("4444")
def post(self):
pass
a = A()
a.get()