Page cover

ABC


Helper class,其 metaclass 為 ABCMeta。當一個 Class 繼承自 ABC 時,它就成為 Abstract Base Class。

PYTHON
abc.ABC

ABC 是包含多個 abstract 方法和 abstract 屬性的 Class,但需要 non-abstract subclass,來提供實現方法和屬性。

這是一種比建立自定義 metaclass 更方便的技術。

Example 1: Basic usage

PYTHON
from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def max_speed(self):
        pass

class Car(Vehicle):
    @property
    def max_speed(self):
        return 200

car = Car()
print(f"Car's max speed: {car.max_speed} km/h") # Output: 200 km/h

Example 2: Basic usage

ABCMeta


定義 Abstract Base Classes (ABCs) 的 metaclass。 Python 中的 metaclass 是 class 的 class,它定義了 class 的行為方式。 abc.ABCMeta 提供了在 ABC 中定義 abstract 方法和屬性的機制。

如果不想繼承 ABC,可以透過在 Class 中設定 metaclass=ABCMeta ,來建立 Abstract Base Class。

雖然您可以直接使用 abc.ABCMeta,但從 abc.ABC 繼承通常更簡單且更具可讀性,它抽象化了 metaclasses 的直接使用。

Example 1: Basic usage

Example 2: Basic usage

register()


用於將具體 class 註冊為 abstract base class 的 "Virtual subclass",這意味著即使它沒有繼承自 ABC,但仍能被 issubclass()isinstance() 等函數識別為 subclass。

Virtual subclass: 視為另一個 Class 的 subclass,但實際上並沒有繼承自另一個 Class。

issubclass()isinstance() 會將註冊的 classes,視為 subclasses,即使它們不是從傳統意義上的 ABC 繼承。

盡可能使用 register() 作為 decorator,因為它使 ABC 和註冊 class 之間的關係更加明顯。

請務必記錄 register() 的使用,因為一個 class 被視為 ABC 的 subclass 的原因,並不總是顯而易見的。

Example 1: Using Decorator

Example 2: Using Method Call

Example 3: Basic usage

當一個 class 繼承自 parent class 時,parent class 會以其方法解析順序 (MRO) 出現,這是 Python 在呼叫方法時,查找方法的順序。

但是,如果一個 class 被註冊為 ABC 的虛擬 subclass,則該 ABC 不會出現在其 MRO 中。這表示 ABC 中定義的方法,不會自動可供虛擬 subclass 使用,而且您不能在虛擬 subclass 中使用 super() 來呼叫這些方法。

Example 4: 影像處理

@abstractmethod


當此 decorator 應用於 abstract base class 中的方法時,表示該方法是抽象的。這意味著必須在 ABC 的任何非抽象 subclass 中重寫該方法。

使用 abstract base classes 和 @abc.abstractmethod 主要為一組 subclasses 定義公共 interface。

清楚記錄每個抽象方法應該做什麼,因為這可以作為開發人員實作 subclasses 的指南。

@abc.abstractmethod 與其他 decorator 結合使用時,應將 abstractmethod 作為最內層 decorator。

例如: @property@classmethod@staticmethod

Example 1: Basic usage

Example 2: Basic usage

執行結果:

Example 3: 抽象 Properties

Example 4: 混合具體方法和抽象方法

Example 5: 影像處理

Last updated

Was this helpful?