Python抽象类用于定义子类必须实现的接口规范,通过abc模块强制约束继承行为;它不可实例化,要求子类重写所有@abstractmethod方法,否则实例化时报TypeError,支持默认实现与复用,适用于框架扩展、插件系统等需保障基础能力的场景。

Python抽象类不是用来实例化的,而是定义子类必须实现的接口规范。它通过abc模块强制约束继承行为,确保不同实现遵循统一契约。
抽象类的核心作用:定义不可绕过的接口
抽象类本身不能创建实例,它的价值在于声明“哪些方法必须被子类重写”。只要在类中定义了@abstractmethod装饰的方法,任何继承它的子类就必须提供具体实现,否则实例化时会报TypeError。
- 不实现抽象方法的子类,无法被实例化(运行时报错,不是语法错误)
- 抽象类可以包含普通方法、类属性、甚至部分实现,供子类复用
- 一个类只要继承了抽象类且未实现全部抽象方法,它自己也自动变成抽象类
如何正确定义和使用抽象类
需要三步:导入ABC和abstractmethod,让类继承ABC,对关键方法加@abstractmethod装饰。
- 必须显式继承
ABC(或使用metaclass=ABCMeta),仅加装饰器不够 - 抽象方法只需声明签名(参数、返回值提示),无需函数体,写
pass或...即可 - 子类中重写抽象方法时,不能漏掉
self等必需参数,签名需兼容
抽象类 vs 协议类(Protocol):选哪个?
抽象类强调“是什么”(is-a关系),要求显式继承和强制实现;协议类强调“能做什么”(结构匹配),支持鸭子类型,无需继承。
立即学习“Python免费学习笔记(深入)”;
- 需要运行时检查、统一基类行为、或想提供默认实现 → 用抽象类
- 只关心对象有没有某几个方法(如
__len__、__iter__),且希望兼容第三方类 → 用Protocol - 抽象类适合框架层定义扩展点,协议类适合类型注解和轻量适配
实际场景中的典型用法
常见于插件系统、数据处理器、策略模式等需要多态但又必须保证基础能力的场景。
- 日志处理器:抽象类定义
log()和close(),子类实现文件写入、网络发送等 - 序列化器:统一
serialize()和deserialize()接口,JSON、XML、Protobuf各自实现 - 避免“忘记实现关键方法”导致的运行时异常,把问题提前到实例化阶段暴露










