
__abstractmethods__
是一個維護系統的屬性,包含必須由 abstract base class 的具體子類別實現的抽象方法和屬性的名稱。
當使用 abc module 定義 abstract base class 時,任何用 @abstractmethod 修飾的方法都會加入到 __abstractmethods__ set 中。除非覆寫其所有抽象方法,否則無法實例化從 abstract base class 繼承的類別。
Example: Basic usage
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 是否已經更改。
它主要用於處理大型 Class 層次結構,並且需要確保正確傳遞 Abstract Class 中的更改的情況。大多數 Python 開發人員可能永遠不需要使用 get_cache_token()。
Example: Basic usage
update_abstractmethods()
用於重新計算 Abstract class 的抽象狀態,在建立 Class 後加入或實現 abstract 方法的情況下非常有用。
如果沒有使用 update_abstractmethods(cls),Python 不會自動重新計算的 abstract 方法。
頻繁使用此函數會使程式碼更難以理解和維護。通常最好對 class 層次結構有一個清晰、靜態的定義。
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
Last updated
Was this helpful?