Python抽象基类(ABC)用于声明接口契约、约束子类行为,不提供默认逻辑;继承后必须实现所有@abstractmethod方法,否则实例化时抛TypeError,支持isinstance/isinstance运行时校验。
Python抽象基类(ABC)不是用来“实现功能”的,而是用来声明接口契约、约束子类行为的。它不提供默认逻辑,也不强制你写具体方法——但一旦你继承它,就必须满足它定义的接口要求,否则运行时报错。
和普通父类不同,ABC 的重点不在继承实现,而在类型检查与协议约定
TypeError
需显式继承 abc.ABC,并用 @abstractmethod 标记关键接口方法:
from abc import ABC, abstractmethodclass Drawable(ABC): @abstractmethod def draw(self) -> None: ...
@abstractmethod def bounding_box(self) -> tuple[int, int, int, int]: ...class Circle(Drawable): def draw(self) -> None: print("Drawing circle")
def bounding_box(self) -> tuple[int, int, int, int]: return (0, 0, 10, 10)✅ 实例化成功
c = Circle()
❌ 若注释掉 bounding_box,实例化时会报错:
TypeError: Can't instantiate abstract class Circle
with abstract method bounding_box
ABC 支持鸭子类型之上的显式契约验证,比 hasattr 更严谨:
isinstance(c, Drawable) → True(哪怕 Circle 没显式写 class Circle(Drawable),也可通过 Drawable.register(Circle) 动态注册)def render(shape: Drawable): ...
typing.Protocol 使用更灵活,但 Protocol 不参与运行时 isinstance 检查初学者容易把 ABC 当成“高级父类”来用,结果反而破坏设计意图:
__init__ 不应标记为 @abstractmethod,构造逻辑通常由子类自行控制Protocol;若需运行时 isinstance 校验,才选 ABC