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 是否已經更改。

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

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

Example: Basic usage

update_abstractmethods()


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

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

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

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

Example: Basic usage

範例 – 計算面積


範例 – 影像處理


參考資料


abc — Abstract Base Classes — Python 3.11.4 documentation

PEP 3119 – 引入抽象基類 | peps.python.org

Python 中的抽象基類 (abc) - GeeksforGeeks

Python interfaces: abandon ABC and switch to Protocols | by Oleg Sinavski | Level Up Coding

python抽象類別 abc模組 - 知乎

Last updated

Was this helpful?