当前位置: 首页 > article >正文

Python枚举的高级玩法:从状态机到策略模式的优雅实现

Python枚举的高级玩法从状态机到策略模式的优雅实现在Python开发中枚举Enum常被简单地用作常量集合但它的潜力远不止于此。对于熟悉设计模式的中高级开发者来说枚举可以成为简化复杂模式实现的利器。本文将带你探索如何用Python枚举优雅地实现状态机和策略模式这些技巧能让你的代码更简洁、更安全、更易维护。1. 枚举基础回顾与高级特性在深入设计模式之前我们先快速回顾一下Python枚举的核心特性并介绍一些可能被忽视的高级用法。Python的enum模块提供了几种枚举类型Enum基础枚举类IntEnum成员值为整数的枚举Flag支持位运算的枚举IntFlag支持位运算且成员值为整数的枚举from enum import Enum, auto class Status(Enum): PENDING auto() PROCESSING auto() COMPLETED auto() FAILED auto()枚举的高级特性包括成员方法可以为枚举类添加方法自定义值成员值可以是任意不可变类型不限于整数别名多个名称可以指向同一个值动态创建可以在运行时动态创建枚举from enum import Enum class HttpMethod(Enum): GET GET POST POST PUT PUT DELETE DELETE classmethod def is_safe(cls, method): return method in (cls.GET, cls.HEAD)2. 用枚举实现状态机模式状态机是软件开发中常见的模式用于管理对象的状态转换。传统实现可能需要大量条件判断而枚举可以显著简化这一过程。2.1 基本状态机实现from enum import Enum, auto class OrderState(Enum): NEW auto() PROCESSING auto() SHIPPED auto() DELIVERED auto() CANCELLED auto() def can_transition_to(self, new_state): transitions { OrderState.NEW: [OrderState.PROCESSING, OrderState.CANCELLED], OrderState.PROCESSING: [OrderState.SHIPPED, OrderState.CANCELLED], OrderState.SHIPPED: [OrderState.DELIVERED], } return new_state in transitions.get(self, [])2.2 带行为的增强型状态机我们可以进一步扩展让每个状态包含自己的行为class DocumentState(Enum): DRAFT auto() MODERATION auto() PUBLISHED auto() ARCHIVED auto() def enter(self, document): handlers { DocumentState.DRAFT: self._enter_draft, DocumentState.MODERATION: self._enter_moderation, DocumentState.PUBLISHED: self._enter_published, DocumentState.ARCHIVED: self._enter_archived, } return handlers[self](document) def _enter_draft(self, document): document.editable True document.visible False def _enter_moderation(self, document): document.editable False document.visible False def _enter_published(self, document): document.editable False document.visible True def _enter_archived(self, document): document.editable False document.visible False2.3 状态机实践建议集中管理转换规则将所有状态转换规则放在一个地方便于维护封装状态行为将与状态相关的行为封装在枚举中使用类型检查利用枚举的类型安全特性减少错误考虑性能对于高频状态检查可以使用IntEnum提高性能3. 枚举驱动的策略模式实现策略模式定义了一系列算法并将每个算法封装起来使它们可以相互替换。枚举为策略模式提供了简洁的实现方式。3.1 基础策略模式from enum import Enum import math class ShapeType(Enum): CIRCLE circle RECTANGLE rectangle TRIANGLE triangle class ShapeCalculator: staticmethod def calculate_area(shape_type, **kwargs): strategies { ShapeType.CIRCLE: lambda: math.pi * kwargs[radius] ** 2, ShapeType.RECTANGLE: lambda: kwargs[width] * kwargs[height], ShapeType.TRIANGLE: lambda: 0.5 * kwargs[base] * kwargs[height], } return strategies[shape_type]()3.2 带上下文的增强策略模式我们可以将策略与上下文数据更紧密地结合class DiscountType(Enum): PERCENTAGE percentage FIXED_AMOUNT fixed_amount BUY_X_GET_Y buy_x_get_y def apply(self, original_price, **kwargs): if self DiscountType.PERCENTAGE: return original_price * (1 - kwargs[percentage] / 100) elif self DiscountType.FIXED_AMOUNT: return max(0, original_price - kwargs[amount]) elif self DiscountType.BUY_X_GET_Y: return original_price * kwargs[x] / (kwargs[x] kwargs[y]) return original_price3.3 策略模式最佳实践策略发现可以自动发现和注册策略减少手动维护策略组合支持策略的组合使用默认策略提供合理的默认行为策略验证验证策略所需的参数是否完整class ExportFormat(Enum): CSV csv JSON json XML xml EXCEL xlsx classmethod def get_exporter(cls, format_type): if format_type not in cls: format_type cls.CSV # 默认策略 exporters { cls.CSV: CSVExporter(), cls.JSON: JSONExporter(), cls.XML: XMLExporter(), cls.EXCEL: ExcelExporter(), } return exporters[format_type]4. 枚举与其他设计模式的结合除了状态机和策略模式枚举还可以简化其他设计模式的实现。4.1 工厂模式class NotificationType(Enum): EMAIL email SMS sms PUSH push def create_notifier(self): if self NotificationType.EMAIL: return EmailNotifier() elif self NotificationType.SMS: return SMSNotifier() elif self NotificationType.PUSH: return PushNotifier() raise ValueError(fUnknown notification type: {self})4.2 访问者模式class LogLevel(Enum): DEBUG 0 INFO 1 WARNING 2 ERROR 3 CRITICAL 4 def accept(self, visitor): visitors { LogLevel.DEBUG: visitor.visit_debug, LogLevel.INFO: visitor.visit_info, LogLevel.WARNING: visitor.visit_warning, LogLevel.ERROR: visitor.visit_error, LogLevel.CRITICAL: visitor.visit_critical, } return visitors[self]()4.3 命令模式class Command(Enum): START start STOP stop PAUSE pause RESUME resume def execute(self, context): commands { Command.START: context.start, Command.STOP: context.stop, Command.PAUSE: context.pause, Command.RESUME: context.resume, } return commands[self]()5. 高级技巧与性能优化5.1 使用__new__自定义枚举创建class SmartEnum(Enum): def __new__(cls, value, description): obj object.__new__(cls) obj._value_ value obj.description description return obj class HttpStatus(SmartEnum): OK (200, 请求成功) CREATED (201, 资源创建成功) BAD_REQUEST (400, 客户端错误) NOT_FOUND (404, 资源不存在) INTERNAL_ERROR (500, 服务器内部错误)5.2 使用IntFlag进行位操作from enum import IntFlag class Permissions(IntFlag): READ 1 WRITE 2 EXECUTE 4 ALL READ | WRITE | EXECUTE user_permissions Permissions.READ | Permissions.WRITE if Permissions.WRITE in user_permissions: print(用户有写权限)5.3 枚举的性能考虑使用IntEnum代替Enum当成员值为整数时IntEnum性能更好避免频繁的成员查找将常用枚举值缓存到局部变量考虑使用模块级常量对性能极其敏感的简单场景# 性能敏感场景的优化 def process_status(status): if status is Status.PENDING: # 使用is而非比较 handle_pending() elif status is Status.PROCESSING: handle_processing()在实际项目中我经常使用枚举来管理各种状态和策略。特别是在处理复杂的业务规则时枚举提供了一种类型安全且易于维护的方式。例如在一个电商系统中我们使用枚举驱动的状态机来管理订单生命周期代码比传统的条件判断方式简洁了约40%同时更易于理解和扩展。

相关文章:

Python枚举的高级玩法:从状态机到策略模式的优雅实现

Python枚举的高级玩法:从状态机到策略模式的优雅实现 在Python开发中,枚举(Enum)常被简单地用作常量集合,但它的潜力远不止于此。对于熟悉设计模式的中高级开发者来说,枚举可以成为简化复杂模式实现的利器。…...

【技术综述】多任务学习中的特征共享机制与优化策略

1. 多任务学习的特征共享机制揭秘 第一次接触多任务学习时,我就像发现了一个神奇的"瑞士军刀"——一个模型居然能同时完成多个任务!但真正用起来才发现,这个工具的精髓在于如何让不同任务"和谐共处"。最核心的问题就是&a…...

EternalBlaze零基础上手指南:三步搞定Windows重复文件硬链接合并

面对日益膨胀的磁盘空间占用,许多Windows用户陷入两难境地。 删除重复文件担心误删重要数据,保留又意味着存储资源的白白浪费。 EternalBlaze的出现为这一问题提供了优雅的解决方案。 本文将从软件获取到实际操作,手把手带你完成第一次硬链…...

单相逆变器Matlab仿真:TCM模式和CCM模式

单相逆变器matlab仿真(TCM模式和CCM模式) 输入400v输出220,L200uH,C20uF,P500w TCM模式: 全周期内实现zvs软开关,负电流控制外环采用pr控制,消除电压静差。 CCM模式: 外环pr控制,内环pi控制最近在研究单相逆…...

django重复导入可能会导致未知错误------无法识别某个函数

from inspire.base import *比如,如果已解决用上面的句子全部导入了,然后再添加这么一句:from inspire.base import goodFun那么可能导致另外一个函数无法识别,例如:from inspire.base import fultureFun这个函数明明…...

Markdown+Pandoc学术论文写作全攻略:从YAML配置到参考文献引用

MarkdownPandoc学术论文写作全攻略:从YAML配置到参考文献引用 在数字化写作工具百花齐放的今天,Markdown以其极简语法和强大兼容性,正成为学术写作的新宠。不同于传统Word文档的繁琐格式调整,Markdown让研究者可以专注于内容本身&…...

023.(实战)定制化Chromedriver编译——彻底规避Selenium指纹检测

1. 为什么需要定制化Chromedriver? 如果你用过Selenium做爬虫或者自动化测试,大概率遇到过被网站识别为机器人的情况。我自己就踩过这个坑——明明代码写得没问题,目标网站却总是返回验证码或者直接封禁IP。后来排查发现,问题出在…...

在Ubuntu 22.04上为Pixel4编译Android 12内核:新旧环境差异与依赖包处理指南

在Ubuntu 22.04上为Pixel4编译Android 12内核:新旧环境差异与依赖包处理指南 如果你正在使用Ubuntu 22.04 LTS为Pixel4编译Android 12内核,可能会发现许多基于Ubuntu 18.04的教程不再适用。新版本的系统库、Python默认版本和依赖包名称的变化&#xff0c…...

华为交换机Sub主从IP地址配置(单个VLAN,实现多个网段互相通信)

一、Sub主从IP介绍1.1 介绍华为核心交换机的 Sub 主从 IP(Secondary IP),是在 VLANIF 三层接口下配置的单接口多 IP 技术,一个接口仅设 1 个主 IP,可配多个带sub关键字的从 IP,主从 IP 分属不同网段&#x…...

动态建模驱动的仓储空间认知能力构建与关键技术研究—— 基于镜像视界 Pixel-to-Space、多视角视频融合、三维重构与轨迹建模的空间计算框架

动态建模驱动的仓储空间认知能力构建与关键技术研究—— 基于镜像视界 Pixel-to-Space、多视角视频融合、三维重构与轨迹建模的空间计算框架一、研究背景:仓储系统迈向“空间认知能力”时代在现代仓储与物流体系中,随着自动化设备、无人运输系统与多主体…...

Jlink与CMSIS-DAP仿真器:如何根据项目需求选择最佳调试工具

1. 嵌入式调试工具的选择困境 刚入行嵌入式开发那会儿,我最头疼的就是选调试工具。面对琳琅满目的仿真器,Jlink和CMSIS-DAP这两个名字总是反复出现。记得第一次用Jlink调试STM32时,那种"秒下载"的畅快感让我印象深刻;而…...

Rust+Spark性能翻倍?快手Blaze引擎实战指南(附TPC-DS测试对比)

RustSpark性能翻倍:Blaze引擎实战与TPC-DS测试深度解析 大数据处理领域正经历一场静默的革命——当传统Spark作业仍在JVM的桎梏中挣扎时,Rust语言与向量化技术的结合正在重塑性能边界。本文将带您深入Blaze引擎的实战集成过程,从环境配置到性…...

CTP接口开发避坑指南:下单过程中那些容易忽略的细节与错误处理

CTP接口开发避坑指南:下单过程中那些容易忽略的细节与错误处理 在金融衍生品交易系统的开发中,CTP接口作为国内期货市场的主流接入方案,其下单环节的稳定性直接关系到交易系统的可靠性。许多开发者在初步掌握基础API调用后,往往会…...

BLE 4.0传输速度翻倍秘籍:实战调整连接参数与写入策略

BLE 4.0传输速度翻倍秘籍:实战调整连接参数与写入策略 在物联网设备开发中,BLE 4.0协议因其低功耗特性被广泛应用,但默认配置下的传输速度往往难以满足固件升级、实时医疗监测等高数据量场景的需求。本文将深入解析如何通过优化连接参数和写入…...

避坑指南:第一次做软件交付如何准备文档?这7个文件缺一不可

软件交付文档全攻略:从零搭建专业交付体系 第一次负责软件交付就像新手司机第一次上高速——既兴奋又忐忑。兴奋的是项目终于到了交付阶段,忐忑的是不知道前方会有什么"坑"等着你。而文档,就是你的导航系统,缺了它&…...

告别手写SQL:用MyBatis-Flex的APT功能,在Spring Boot 3里5分钟搞定增删改查

告别手写SQL:用MyBatis-Flex的APT功能,在Spring Boot 3里5分钟搞定增删改查 每次新建一个数据表,你是否还在重复编写那些几乎一模一样的CRUD代码?从实体类定义到Mapper接口,再到各种查询条件的拼接,这些重复…...

基于AI微信小程序的心理咨询预约系统_ohyab8bm

目录需求分析与功能设计技术选型与架构设计核心功能实现测试与部署运营与迭代项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能设计 明确心理咨询预约系统的核心需求,包括用户注册/登录、心理咨询师信…...

vue+python智能医疗辅助系统的

目录技术栈选择系统模块设计核心实现步骤部署方案关键代码示例项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 前端采用Vue 3 TypeScript Vite构建,UI框架使用Element Plus或Ant Design Vue。后端基于…...

永磁同步电机SVPWM自适应无位置算法控制仿真Simulink模型探索

永磁同步电机SVPWM自适应无位置算法控制仿真simulink模型。 配文档,仅供学习。在电机控制领域,永磁同步电机(PMSM)凭借其高效、节能等优点,广泛应用于工业、交通等诸多领域。而要实现对PMSM精准且高效的控制&#xff0…...

基于FPGA的FFT法相差检测Verilog实现之旅

基于FPGA的信号处理算法,FFT法相差检测verilog实现 1.硬件平台:altera芯片 2.软件平台:Quartusii 13.1 Verilog 3.实现功能:检测两路正弦波的相位在信号处理的广袤领域中,基于FPGA(现场可编程门阵列&#x…...

从 Vibe Coding 到 Agentic Engineering:ArkClaw + Supabase,打造你的私有化 Agent 工厂

核心提要:当“Vibe Coding”(氛围编程)从一个梗变成现实,我们是否想过,AI 能做的远不止生成代码片段?本文将带你探索如何将强大的智能体框架 ArkClaw 与 Serverless 后端平台 Supabase 结合,打造…...

深入理解OPTIONS请求:跨域预检的机制与实践

1. OPTIONS请求的本质与跨域预检机制 第一次在Chrome开发者工具里看到那个神秘的OPTIONS请求时,我也是一头雾水。明明只发了一个POST请求,为什么控制台里会多出个"无关"的请求?后来才知道,这正是浏览器保护我们安全的&q…...

springboot基于vue美剧观影点评网站的设计与实现

目录技术选型核心模块设计关键实现步骤数据模型示例典型API示例安全控制措施测试部署方案扩展优化方向项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型 后端框架:Spring Boot 2.7.x(Java 11&…...

从ME11到MEK1:SAP采购条件记录创建的BAPI性能对比(含RV_CONDITION_COPY完整示例)

SAP采购条件记录创建:ME11与MEK1的BAPI性能深度解析 在SAP采购模块中,条件记录创建是供应链管理的关键环节。传统ME11事务码虽然直观易用,但在批量处理和系统集成场景下,MEK1配合BAPI调用往往展现出更强大的技术优势。本文将深入剖…...

从L1到L3:图解现代CPU缓存如何影响你的游戏帧数

从L1到L3:现代CPU缓存如何塑造游戏性能的底层逻辑 当你在《赛博朋克2077》的夜之城飙车时,每秒超过60帧的画面流畅度背后,隐藏着一场由CPU缓存主导的微观战争。游戏开发者都知道,GPU决定了画面的上限,但CPU缓存才是决定…...

从AND门到Filler单元:一份给数字IC工程师的标准单元库避坑指南

从AND门到Filler单元:数字IC工程师的标准单元库实战手册 在数字集成电路设计的浩瀚宇宙中,标准单元库就像是一套精密的乐高积木,而工程师则是用这些积木搭建复杂系统的建筑师。当我第一次接手一个40nm工艺节点的芯片设计项目时,面…...

JeecgBoot v3.8.3 低代码实战:从零构建Spring Boot 3 + Vue3业务模块

1. 环境准备与项目初始化 第一次接触JeecgBoot时,我被它"低代码"的宣传语吸引,但真正让我惊艳的是v3.8.3版本对Spring Boot 3和Java 21的全面支持。记得当时为了测试性能,我特意用JDK 21跑了个简单的客户管理模块,启动速…...

【从零构建Berkeley Humanoid Lite:全栈开源人形机器人技术实战】第二章 硬件系统深度解析(物理层实现)

目录 2.1 3D打印摆线减速器工程实现 2.1.1 摆线齿轮力学设计(解决塑料强度瓶颈) 2.1.2 双规格执行器家族(6512与5010) 2.1.3 可靠性工程数据 2.2 分布式感知与通信网络 2.2.1 CAN总线拓扑架构 2.2.2 本体感知系统 脚本1:摆线齿轮参数化生成与强度验证(Python + S…...

保姆级教程:用YOLOv8和PyQt5从零搭建番茄成熟度检测桌面应用(附完整源码)

从零构建番茄成熟度检测桌面应用:YOLOv8与PyQt5实战指南 在农业生产智能化浪潮中,计算机视觉技术正逐步改变传统农作物监测方式。本文将带您完整实现一个结合YOLOv8目标检测与PyQt5图形界面的番茄成熟度分析工具,涵盖从环境配置到最终打包的全…...

程序员如何用ProcessOn复刻《纳瓦尔宝典》思维导图?我的实操笔记与模板分享

程序员如何用ProcessOn复刻《纳瓦尔宝典》思维导图?我的实操笔记与模板分享 作为程序员,我们习惯于用代码构建系统,却很少将这种结构化思维应用到知识管理中。当我第一次读到《纳瓦尔宝典》时,就被书中关于财富、幸福和判断力的深…...