新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python面向对象:抽象类ABC与抽象方法abstractmethod

发布时间:2026/10/1 8:26:28来源:尧图网络
Python面向对象:抽象类ABC与抽象方法abstractmethod
一、开篇强制子类实现某些方法在OOP中有时你需要定义一个接口——规定子类必须实现哪些方法但不提供默认实现或只提供部分默认实现。这就是抽象基类ABC, Abstract Base Class的用途。⌨️ 基本用法fromabcimportABC,abstractmethodclassAnimal(ABC):动物——抽象基类不能直接实例化abstractmethoddefspeak(self):说话——每个子类必须实现passabstractmethoddefmove(self):移动——每个子类必须实现passdefsleep(self):睡觉——普通方法有默认实现returnf{self.__class__.__name__}正在睡觉...# animal Animal() # TypeError! 不能实例化抽象类classDog(Animal):defspeak(self):# 必须实现return汪汪defmove(self):# 必须实现return四条腿跑# 可以实例化——实现了所有抽象方法dogDog()print(dog.speak())# 汪汪print(dog.sleep())# Dog正在睡觉... ABC abstractmethod “合同”。子类签了合同就必须履行——实现所有抽象方法否则自身的实例化也会被阻止。二、ABC的深入用法2.1 抽象方法可以有默认实现fromabcimportABC,abstractmethodclassDataExporter(ABC):数据导出器——抽象基类abstractmethoddefexport(self,data,filepath):导出数据——子类必须实现# 抽象方法也可以有默认实现# 子类可以通过super()来复用ifnotdata:raiseValueError(数据不能为空)print(f导出{len(data)}条记录到{filepath})returnfilepathclassJsonExporter(DataExporter):defexport(self,data,filepath):# 调用父类的默认验证逻辑super().export(data,filepath)importjsonwithopen(filepath,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)print(导出为JSON格式)classCsvExporter(DataExporter):defexport(self,data,filepath):super().export(data,filepath)importcsvwithopen(filepath,w,newline,encodingutf-8-sig)asf:writercsv.DictWriter(f,fieldnamesdata[0].keys())writer.writeheader()writer.writerows(data)print(导出为CSV格式)# exporter JsonExporter()# exporter.export([{name: 张三}], output.json)2.2 抽象属性和抽象类方法fromabcimportABC,abstractmethodclassConfigProvider(ABC):配置提供者——要求子类提供属性和类方法propertyabstractmethoddefconfig_name(self):抽象属性——子类必须定义passclassmethodabstractmethoddefget_default_config(cls):抽象类方法——子类必须实现passclassDatabaseConfig(ConfigProvider):config_name数据库配置# 实现抽象属性classmethoddefget_default_config(cls):return{host:localhost,port:5432,database:mydb,}# db_config DatabaseConfig()# print(db_config.config_name)# print(DatabaseConfig.get_default_config())三、ABC的实际应用3.1 插件系统fromabcimportABC,abstractmethodclassPlugin(ABC):插件——抽象基类定义插件接口abstractmethoddefname(self):插件名称passabstractmethoddefversion(self):插件版本passabstractmethoddefexecute(self,context):执行插件passdefon_load(self):插件加载时回调——可选实现print(f插件{self.name()}v{self.version()}已加载)classLogPlugin(Plugin):defname(self):return日志插件defversion(self):return1.0.0defexecute(self,context):print(f[日志] 记录操作:{context})classCachePlugin(Plugin):defname(self):return缓存插件defversion(self):return2.1.0defexecute(self,context):print(f[缓存] 缓存数据:{context})defon_load(self):print(f缓存插件初始化了内存缓存)# 插件管理器——不需要知道具体插件类型classPluginManager:def__init__(self):self.plugins[]defregister(self,plugin):ifnotisinstance(plugin,Plugin):raiseTypeError(必须注册Plugin的子类)plugin.on_load()self.plugins.append(plugin)defexecute_all(self,context):forplugininself.plugins:plugin.execute(context)managerPluginManager()manager.register(LogPlugin())manager.register(CachePlugin())manager.execute_all(用户登录操作)3.2 虚拟子类——用register注册fromabcimportABC,abstractmethod# ABC的另一种用法register()——注册虚拟子类# 虚拟子类不需要真正继承ABC但isinstance和issubclass会返回TrueclassDrawable(ABC):abstractmethoddefdraw(self):pass# 已有第三方类——不能修改其继承关系classLegacyCircle:第三方库中的类——不能修改defdraw(self):return绘制圆形旧实现classLegacyRectangle:defdraw(self):return绘制矩形旧实现# 注册为虚拟子类Drawable.register(LegacyCircle)Drawable.register(LegacyRectangle)# 现在isinstance能识别它们circleLegacyCircle()rectLegacyRectangle()print(isinstance(circle,Drawable))# Trueprint(isinstance(rect,Drawable))# Trueprint(issubclass(LegacyCircle,Drawable))# True# 注册后Drawable的抽象方法不能强制这些类实现# 这是鸭子类型的正式化——告诉类型检查器这些类满足接口四、collections.abc——标准库的抽象基类fromcollections.abcimportIterable,Sequence,Mapping,MutableMapping# Python标准库已经定义了常见的ABC# 检查对象是否满足协议# 是迭代器吗print(isinstance([1,2,3],Iterable))# Trueprint(isinstance(42,Iterable))# False# 是序列吗有__getitem__和__len__print(isinstance([1,2,3],Sequence))# Trueprint(isinstance((1,2,3),Sequence))# Trueprint(isinstance({1,2,3},Sequence))# False —— set不是序列# 是映射吗类似字典print(isinstance({a:1},Mapping))# Trueprint(isinstance({a:1},MutableMapping))# True# 常用标准ABC# Iterable, Iterator, Generator# Sequence, MutableSequence# Mapping, MutableMapping# Set, MutableSet# Callable, Hashable# Sized (有__len__)五、抽象类 vs 鸭子类型# 两种设计哲学的对比# 方式一ABC——显式约束fromabcimportABC,abstractmethodclassPaymentProcessor(ABC):abstractmethoddefprocess_payment(self,amount):passdefhandle_payment_abc(processor:PaymentProcessor,amount:float):要求传入PaymentProcessor的子类processor.process_payment(amount)# 方式二鸭子类型——隐式约定defhandle_payment_duck(processor,amount):只要processor有process_payment方法就行processor.process_payment(amount)# 选择建议# ABC大型系统、团队协作、IDE支持更好类型检查# 鸭子类型小项目、脚本、灵活性优先# Python标准库多用鸭子类型六、总结ABC为Python的鸭子类型世界引入了显式约束——当灵活性不够用的时候它让接口变得明确。核心要点ABCabstractmethod——定义抽象基类和抽象方法不能实例化抽象类——直到所有抽象方法被实现抽象方法可有默认实现——子类通过super()调用register()注册虚拟子类——不需要实际继承collections.abc——标准库预定义的抽象基类✅当你需要这些类必须实现这些方法的保证时用ABC。否则相信鸭子类型。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CNN-BiLSTM时序预测实战:特征解耦与梯度桥接 2026/10/1 9:26:28

CNN-BiLSTM时序预测实战:特征解耦与梯度桥接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
BongoCat macOS Metal 叠加层帧耗时基准(90e0aa7):有界 draw 计时管线与 60 FPS 诊断基线解析 2026/10/1 9:26:28

BongoCat macOS Metal 叠加层帧耗时基准(90e0aa7):有界 draw 计时管线与 60 FPS 诊断基线解析

桌面应用 【免费下载链接】BongoCat 🐱 BongoCat — A cross-platform interactive desktop pet that brings fun to your desktop! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 点击查看 免费下载 导读 本文基于 BongoCat 仓库中的第一份…

阅读更多 →
跨平台二进制兼容实战:Wine、FEX-Emu与DXMT分层翻译解析 2026/10/1 9:26:28

跨平台二进制兼容实战:Wine、FEX-Emu与DXMT分层翻译解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
产品开发项目实施计划书:从文档到推进引擎的落地指南 2026/10/1 9:26:28

产品开发项目实施计划书:从文档到推进引擎的落地指南

简介:这份《产品开发项目实施计划书》是一份面向产品开发项目经理、研发负责人及PMO人员的完整项目管理文档模板,适用于硬件设备自主研发类项目的全流程规划。文档以四角研磨设备自主研发为实例,系统梳理了从项目概况、组织结构、依赖关系分析…

阅读更多 →
图书管理系统需求分析+可行性+开发计划全流程实战拆解 2026/10/1 9:26:27

图书管理系统需求分析+可行性+开发计划全流程实战拆解

简介:图书管理系统需求分析、可行性研究与开发计划整合报告,面向软件工程专业学生、项目开发团队及需要编写软件工程文档的读者,用于理清图书馆管理系统的前期规划、任务分解、预算与风险控制等关键环节。资源为单个PDF文档,压缩包…

阅读更多 →
人力资源管理系统用例分析:登录、考勤到招聘的设计要点 2026/10/1 9:26:21

人力资源管理系统用例分析:登录、考勤到招聘的设计要点

简介:这是一份人力资源管理系统用例分析文档,主要面向软件工程课程设计、毕业设计或企业HR系统前期的需求分析工作。文档以用例图为抓手,系统梳理了登录、员工管理、考勤管理等模块的参与角色与功能流程,并延伸至招聘管理模块。其…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉