如果你熟悉 Java 的話,Java 里有一個抽象接口的概念,Python 里的抽象方法基本上與其類似。
在 Python 中,@abstractmethod
?是一個裝飾器,用于定義抽象方法。它是實現抽象基類(Abstract Base Class, ABC)的核心工具,通過?abc
?模塊提供。抽象方法要求子類必須實現該方法,否則子類無法被實例化(當然,如果子類本身只是作為中間類,不需要實例化的話,也是無需實現該方法的)。
抽象基類(ABC):包含至少一個抽象方法的類,不能直接實例化。
抽象方法:聲明但不實現的方法(只有方法簽名),子類必須重寫。
作用:強制子類實現特定方法,確保接口一致性(類似 Java?的接口)。
from abc import ABC, abstractmethod# 抽象基類
class Animal(ABC):@abstractmethoddef make_sound(self):pass # 無具體實現def sleep(self): # 非抽象方法(可選實現)print("Zzz...")# 子類必須實現抽象方法
class Dog(Animal):def make_sound(self):return "Woof!"class Cat(Animal):def make_sound(self):return "Meow!"# 正確用法
dog = Dog()
print(dog.make_sound()) # 輸出: Woof!# 錯誤示范:未實現抽象方法的子類
class Bird(Animal):pass # 未重寫 make_sound# 嘗試實例化會報錯
try:bird = Bird() # TypeError: Can't instantiate abstract class Bird with abstract method make_sound
except TypeError as e:print(e) # 輸出錯誤信息animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract method make_sound
一般常用于以下用途:
定義接口規范:強制子類實現特定 API。
框架設計:確保插件或擴展實現必要方法。
類型檢查:結合?isinstance()
?檢查對象是否實現了接口。
特性 | 說明 |
---|---|
目的 | 強制子類實現特定方法 |
使用場景 | 定義接口、框架設計、多態約束 |
關鍵裝飾器 | @abstractmethod |
基類要求 | 繼承?ABC ?或使用?metaclass=ABCMeta |
實例化限制 | 抽象基類和未實現全部抽象方法的子類不能被實例化 |