Page cover

__abstractmethods__


是一個維護系統的屬性,包含必須由 abstract base class 的具體子類別實現的抽象方法和屬性的名稱。

當使用 abc module 定義 abstract base class 時,任何用 @abstractmethod 修飾的方法都會加入到 __abstractmethods__ set 中。除非覆寫其所有抽象方法,否則無法實例化從 abstract base class 繼承的類別。

Example: Basic usage

PYTHON
import abc

class ElectronicDevice(abc.ABC):
    @abc.abstractmethod
    def turn_on(self):
        pass

    @abc.abstractmethod
    def turn_off(self):
        pass

    @property
    @abc.abstractmethod
    def is_on(self):
        pass


class Television(ElectronicDevice):
    def __init__(self):
        self._is_on = False

    def turn_on(self):
        if not self._is_on:
            self._is_on = True
            print("Television is now ON.")

    def turn_off(self):
        if self._is_on:
            self._is_on = False
            print("Television is now OFF.")

    @property
    def is_on(self):
        return self._is_on
    
print(ElectronicDevice.__abstractmethods__) # Output: frozenset({'turn_on', 'turn_off', 'is_on'})
print(Television.__abstractmethods__)       # Output: frozenset()

get_cache_token()


提供了一個 token,每次透過 register() 修改ABC時,該 token 都會更改。此 token 對於 caching 和追蹤 ABC registry 的變更很有用。

它返回一個不透明的物件 (意味著用戶無法直接理解或使用其內部結構),用於標記 Virtual subclass cache 的版本。 該物件支援相等性測試,因此可以用來檢查 cache 是否已經更改。

circle-info

每次在調用 register() 時,cache token 都會發生變化。 這意味著當您註冊 Virtual subclass cache 時,cache token 將會更改。

Cache token 是一種版本控制的機制。

circle-exclamation

Example: Basic usage

update_abstractmethods()


用於重新計算 Abstract class 的抽象狀態,在建立 Class 後加入或實現 abstract 方法的情況下非常有用。

如果沒有使用 update_abstractmethods(cls),Python 不會自動重新計算的 abstract 方法。

circle-info

在 Abstract class 已經定義之後,您不能動態地加入新的 abstract 方法。 僅能使用 update_abstractmethods()

circle-info

update_abstractmethods() 並不常用。用例涉及動態行為,這在傳統的 Python 應用程式中並不常見。它更常見於進行大量 meta-programming 的 rameworks or libraries 中。

circle-exclamation

Example: Basic usage

範例 – 計算面積


範例 – 影像處理


參考資料


abc — Abstract Base Classes — Python 3.11.4 documentationarrow-up-right

PEP 3119 – 引入抽象基類 | peps.python.orgarrow-up-right

Python 中的抽象基類 (abc) - GeeksforGeeksarrow-up-right

Python interfaces: abandon ABC and switch to Protocols | by Oleg Sinavski | Level Up Codingarrow-up-right

python抽象類別 abc模組 - 知乎arrow-up-right

Last updated