天天看點

Python 類與對象程式設計詳解五(抽象類,接口類)

上一篇: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()