如果你熟悉 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 |
实例化限制 | 抽象基类和未实现全部抽象方法的子类不能被实例化 |