【Python】抽象基类ABC

抽象基类(Abstract Base Classes)的核心作用

抽象基类(ABC)是Python中一种特殊的类,它通过abc模块实现,主要服务于面向对象编程中的接口规范和设计约束。以下是它的核心作用:

1. 强制接口实现(核心作用)

确保子类必须实现特定的方法,否则在实例化时会报错。

from abc import ABC, abstractmethodclass Vehicle(ABC):@abstractmethoddef start_engine(self):  # 子类必须实现这个方法passclass Car(Vehicle):def start_engine(self):  # 必须实现抽象方法print("汽车引擎启动")# 如果不实现start_engine,实例化时会报错
# class Bike(Vehicle): pass  
# Bike()  # TypeError!

2. 定义清晰的接口契约

明确声明一个类应该提供哪些功能,使代码更易理解和维护。

class Database(ABC):@abstractmethoddef connect(self):"""必须实现数据库连接方法"""@abstractmethoddef execute_query(self, query):"""必须实现查询执行方法"""

3. 防止直接实例化基类

抽象基类本身不能被实例化,只能通过具体子类使用。

class Animal(ABC):@abstractmethoddef make_sound(self):pass# Animal()  # 报错:无法实例化抽象类

4. 实现"鸭子类型"的类型检查

使用isinstance()检查对象是否符合特定接口,而不需要实际继承。

class MyDatabase:  # 没有继承Databasedef connect(self): print("连接")def execute_query(self, q): print("执行查询")Database.register(MyDatabase)  # 注册为虚拟子类db = MyDatabase()
print(isinstance(db, Database))  # 输出: True

5. 支持多态设计

为不同实现提供统一接口,实现设计模式如策略模式、工厂模式等。

class Renderer(ABC):@abstractmethoddef render(self, data):passclass HTMLRenderer(Renderer):def render(self, data):return f"<html>{data}</html>"class JSONRenderer(Renderer):def render(self, data):return f'{{"data": "{data}"}}'# 多态调用
renderers = [HTMLRenderer(), JSONRenderer()]
for r in renderers:print(r.render("Hello"))

6. 文档化接口

作为代码自文档化工具,明确展示类应该实现哪些方法。

实际应用场景

  1. 框架开发:定义插件接口规范

    class PluginBase(ABC):@abstractmethoddef initialize(self, config):pass@abstractmethoddef execute(self, input_data):pass
    
  2. API设计:强制第三方实现必要方法

    class PaymentGateway(ABC):@abstractmethoddef process_payment(self, amount):pass
    
  3. 大型项目:保持代码一致性

    class DataValidator(ABC):@abstractmethoddef validate(self, data):"""所有数据验证器必须实现此方法"""
    
  4. 测试:创建模拟对象必须实现的接口

    class MockDB(ABC):@abstractmethoddef get_record(self, id):pass
    

与普通基类的区别

特性普通基类抽象基类(ABC)
实例化可以直接实例化不能直接实例化
方法实现可以提供默认实现可以强制要求子类实现
类型检查必须实际继承支持虚拟子类注册
设计意图代码复用接口规范

抽象基类特别适合中大型项目,当需要严格定义接口规范时,它能显著提高代码的可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python] Python单例模式:__new__与线程安全解析

一 实例的创建过程 我们之前了解过在构造一个类的实例化对象时,会默认调用__init__方法&#xff0c;也就是类的初始化也叫构造函数&#xff0c;但其实在调用__init__方法前会首先调用__new__方法&#xff08;只有在py3新式类才有&#xff09;。即下面 __new__(): 创建实例 作…

笔记本电脑打开网页很慢,一查ip地址网段不对怎么处理

我有一个笔记本&#xff0c;在家里连WIFI后获取到的ip地址网段不对&#xff0c;那么常规做法是手动去配置个静态IP和DNS&#xff0c;要知道笔记本IP地址默认采用的是DHCP&#xff0c;也就是动态获取ip地址。如果手动设置静态IP&#xff0c;也就是固定IP的话&#xff0c;你换个场…

怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)

【SAP系统研究】 对SAP系统中的报表,最方便的格式就是ALV了,可排序、可导出,非常友好。 但有些常见报表却不是默认ALV界面的,譬如MB52: 是不是有点别扭?但其实是可以后台配置进行调整的。 现将一些常用报表修改为默认ALV的方法进行总结,便于大家使用。 一、MB52、MB5…

Redis——达人探店

达人探店 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合&#xff0c;对应的表有两个&#xff1a; 发布博文对应两个接口 案例&#xff1a;实现查看发布探店笔记的接口 需求&#xff1a;点击首页的探店笔记&#xff0c;会进入详情页面&#xff0c;实现…

Git初始化相关配置

Git配置 在Git安装完成后&#xff0c;windows操作系统上会多出一个Git Bash的软件&#xff0c;如果是linux或者是macOS&#xff0c;那么直接打开终端&#xff0c;在终端中敲击命令即可 # 检查git版本 git -v # 或 git --version在使用git时&#xff0c;需要配置一下用户名和邮…

MySQL JSON_ARRAYAGG 实现汇总+明细数据展示

一、业务场景 在投注记录查询功能中&#xff0c;我们需要展示每个彩票期号(userId lotteryIssue分组)的汇总数据&#xff08;总金额、总注数&#xff09;&#xff0c;同时也要显示该期号下的所有明细投注记录。 解决方案&#xff1a;JSON_ARRAYAGG MySQL 5.7 提供的 JSON_A…

【Lua】Redis 自增并设置有效期

【Lua】Redis 自增并设置有效期 方案一 每次执行都会更新有效期 EVAL "local current redis.call(INCRBY, KEYS[1], ARGV[1]);if tonumber(ARGV[2]) > 0 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end;return current;" 1 mycounter 1 10 参数: 1 代表KEY…

CCF第七届AIOps国际挑战赛季军分享(RAG)

分享CCF 第七届AIOps国际挑战赛的季军方案&#xff0c;从我们的比赛经历来看&#xff0c;并不会&#xff0c;相反&#xff0c;私域领域问答的优秀效果说明RAG真的很重要 历经4个月的时间&#xff0c;从初赛赛道第1&#xff0c;复赛赛道第2&#xff0c;到最后决赛获得季军&…

YOLO v2:目标检测领域的全面性进化

引言 在YOLO v1取得巨大成功之后&#xff0c;Joseph Redmon等人在2016年提出了YOLO v2&#xff08;也称为YOLO9000&#xff09;&#xff0c;这是一个在准确率和速度上都取得显著提升的版本。YOLO v2不仅保持了v1的高速特性&#xff0c;还通过一系列创新技术大幅提高了检测精度…

Linux-Ubuntu安装Stable Diffusion Forge

SD Forge在Win上配置起来相对简单且教程丰富&#xff0c;而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版&#xff08;对其他Linux以及SD分支亦有参考价值&#xff09;的Stable Diffusion ForgeUI安装配置教程&#xff0c;希望有所帮助 本教程以N…

量子计算实用化突破:从云端平台到国际竞合,开启算力革命新纪元

在硅谷某生物医药实验室&#xff0c;研究员艾米丽正盯着量子计算模拟界面露出微笑 —— 搭载中电信 "天衍" 量子计算云平台的 880 比特超导量子处理器&#xff0c;用 17 分钟完成了传统超算需 3 个月才能跑完的新型抗生素分子键合模拟。这个场景标志着量子计算正从 &…

计算机操作系统(七)详细讲解进程的组成与特性,状态与转换

计算机操作系统&#xff08;七&#xff09;进程的组成与特性&#xff0c;状态与转换 前言一、进程的组成1. 什么是“进程”&#xff1f;2. 进程的三个核心组成部分2.1 PCB&#xff08;进程控制块&#xff09;—— 进程的“身份证户口本”2.2 程序段—— 进程的“任务清单”2.3 …

MapReduce基本介绍

核心思想 分而治之&#xff1a;将大规模的数据处理任务分解成多个可以并行处理的子任务&#xff0c;然后将这些子任务分配到不同的计算节点上进行处理&#xff0c;最后将各个子任务的处理结果合并起来&#xff0c;得到最终的结果。 工作流程 Map 阶段&#xff1a; 输入数据被…

Linux操作系统实战:中断源码的性能分析(转)

Linux中断是指在Linux操作系统中&#xff0c;当硬件设备或软件触发某个事件时&#xff0c;CPU会中断正在执行的任务&#xff0c;并立即处理这个事件。它是实现实时响应和处理外部事件的重要机制&#xff0c;Linux中断可以分为两种类型&#xff1a;硬件中断和软件中断&#xff0…

AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG

开篇 在第64课《AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)》中我们提到了提示词Rewrite,同时还讲到了2024年年末开始出现的新的理论,并把RAG系统推入到了3.0模式,业界出现了“3R”理念的RAG引擎,基于“3R”理念可以彻底消除RAG的幻觉…

Clion内置宏$PROJECT_DIR$等

CLion 内置宏 文章目录 CLion 内置宏通用路径相关宏路径相对化宏 官方文档地址&#xff1a; https://www.jetbrains.com/help/clion/built-in-macros.html 通用路径相关宏 宏名称含义说明示例$WORKSPACE_DIR$当前项目所属的工作区根目录路径。/home/user/workspace$PROJECT_D…

机器学习基础课程-5-课程实验

5.1 实验介绍 实验背景 在这个项目中&#xff0c;您将使用1994年美国人口普查收集的数据&#xff0c;选用几个监督学习算法以准确地建模被调查者的收入。然后&#xff0c;您将根据初步结果从中选择出最佳的候选算法&#xff0c;并进一步优化该算法以最好地建模这些数据。你的目…

Android RecyclerView自带的OnFlingListener,Kotlin

Android RecyclerView自带的OnFlingListener&#xff0c;Kotlin Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener检测用户的快滑fling事件。发现RecyclerView也自带了监…

第3.4节 调用链路分析服务开发

3.4.1 什么是Code Call Graph&#xff08;CCG&#xff09; Code Call Graph&#xff08;CCG&#xff09;即业务代码中的调用关系图&#xff0c;是通过静态分析手段分析并构建出的一种描述代码间关系的图。根据精度不同&#xff0c;一般分为类级别、方法级别、控制流级别&#x…

【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤

一、前言 Liblib AI&#xff08;哩布哩布 AI&#xff09;是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。 强大的图像生成能力 &#xff1a;以 Stable Diffusion 技术为核心&#xff0c;提供文生图、图生图、图像后期处理等功能&#xff…