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 Cir
cle(Drawable),也可通过 Drawable.register(Circle) 动态注册)def render(shape: Drawable): ...
typing.Protocol 使用更灵活,但 Protocol 不参与运行时 isinstance 检查初学者容易把 ABC 当成“高级父类”来用,结果反而破坏设计意图:
__init__ 不应标记为 @abstractmethod,构造逻辑通常由子类自行控制Protocol;若需运行时 isinstance 校验,才选 ABC
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】
Mac版Final Cut Pro入门_Mac视频剪辑基础操作【教程】
如何使用Golang管理模块版本_Golanggo mod tidy与升级方法
Win11怎么关闭通知中心_Windows11系统通知与专注助手设置
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
C++中的std::shared_from_this有什么用?C++安全获取this的shared_ptr【智能指针】
Windows10如何更改桌面背景_Win10个性化幻灯片放映设置
Win10怎么卸载鲁大师_Win10彻底卸载鲁大师方法【步骤】
Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】
Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看
php485在macos下怎么配置_php485 macOS系统配置指南【解答】
c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】
Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】
Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选
Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
如何优化Golang内存分配与GC调度_Golang垃圾回收优化示例
Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
windows如何备份注册表_windows导出和导入注册表文件教程
Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】
如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法
Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭
Windows11怎么用“记事本”自动换行与编码 Windows11记事本启用自动换行选择UTF-8编码避免乱码兼容多语言【教程】
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
如何将竖排文本文件转换为横排字符串
Mac如何将HEIC图片格式转为JPG_Mac批量转换图片【指南】
c# await 一个已经完成的Task会发生什么
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
如何快速验证Golang安装是否成功_运行go version和hello world示例
c++ nullptr与NULL区别_c++11空指针规范
c++中如何使用虚函数实现多态_c++多态性实现原理
Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小
Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】
Mac如何设置动态壁纸?(让桌面动起来)
c# 服务器GC和工作站GC的区别和设置
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件
Windows10系统服务优化指南_Win10禁用不必要服务提升性能
如何在 ACF 中正确更新嵌套多层的 Group 字段子字段
Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】
Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】
Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决
如何在Golang中捕获JSON序列化错误_Golangjson.Marshal错误处理示例
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
2025-12-30
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。