网站首页 > 技术文章 正文
为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?
if status == 1:
print("开始处理")
elif status == 2:
print("处理中")
elif status == 3:
print("已完成")
这些“魔法数字”虽然能用,但可读性和维护性极差。 Python 3 的Enum(枚举类)就是为此而生——它能将数字变成有意义的符号,让代码瞬间“说人话”。
一、基础操作:5分钟上手Python枚举
定义第一个枚举类
from enum import Enum
class OrderStatus(Enum):
PENDING = 1 # 待处理
PROCESSING = 2 # 处理中
COMPLETED = 3 # 已完成
用法示例:
current_status = OrderStatus.PROCESSING
print(current_status.value) # 输出:2
print(current_status.name) # 输出:'PROCESSING'
优势:
- o 避免直接操作数字,代码一目了然
- o 防止无效值(比如status=4会直接报错)
二、进阶技巧1:动态扩展枚举成员
场景:
现有OrderStatus需要新增状态CANCELLED=4,但不想修改原代码(比如枚举类来自第三方库)。
解决方案:虽然无法直接继承,但可通过组合枚举成员实现:
class ExtendedOrderStatus(Enum):
# 直接包含原成员
PENDING = OrderStatus.PENDING.value # 待处理
PROCESSING = OrderStatus.PROCESSING.value # 处理中
COMPLETED = OrderStatus.COMPLETED.value # 已完成
CANCELLED = 4 # 新增“已取消”状态
REFUNDED = 5 # 新增“已退款”状态
# 使用新状态
print(ExtendedOrderStatus.CANCELLED.value) # 输出:4
三、进阶技巧2:给枚举“添加超能力”
场景:
订单状态需要关联更多信息,比如状态描述、对应的操作按钮。
解决方案:在子类中添加方法!
class ExtendedOrderStatus(OrderStatus):
CANCELLED = 4
REFUNDED = 5
def get_action(self):
# 为不同状态返回操作提示
if self == ExtendedOrderStatus.CANCELLED:
return "联系客服申诉"
elif self == ExtendedOrderStatus.REFUNDED:
return "查看退款详情"
else:
return super().get_action() # 调用父类逻辑(如有)
调用示例:
class ExtendedOrderStatus(Enum):
# 直接包含原成员
PENDING = OrderStatus.PENDING.value # 待处理
PROCESSING = OrderStatus.PROCESSING.value # 处理中
COMPLETED = OrderStatus.COMPLETED.value # 已完成
CANCELLED = 4 # 新增“已取消”状态
REFUNDED = 5 # 新增“已退款”状态
def get_action(self):
# 为不同状态返回操作提示
if self == ExtendedOrderStatus.CANCELLED:
return "联系客服申诉"
elif self == ExtendedOrderStatus.REFUNDED:
return "查看退款详情"
else:
return super().get_action() # 调用父类逻辑(如有)
status = ExtendedOrderStatus.CANCELLED
print(status.get_action()) # 输出:"联系客服申诉"
四、避坑指南:扩展枚举的3个注意事项
1、成员名冲突
子类成员名若与父类重复,会直接报错!确保名称唯一。
2、 值无需连续
枚举值可以是任意类型(字符串、元组等),不一定用数字:
class Priority(Enum):
HIGH = (1, "红色")
MEDIUM = (2, "黄色")
LOW = (3, "绿色")
3、慎用auto()
自动赋值虽方便,但扩展时可能导致值重复,建议显式定义。
五、实战案例:枚举在业务中的妙用
场景:电商订单状态流转
from enum import Enum
class OrderStatus(Enum):
CREATED = {"code": 10, "desc": "订单已创建"}
PAID = {"code": 20, "desc": "已支付"}
SHIPPED = {"code": 30, "desc": "已发货"}
def can_cancel(self):
# 判断当前状态是否允许取消
return self in (OrderStatus.CREATED, OrderStatus.PAID)
status = OrderStatus.PAID
print(status.can_cancel()) # True
status = OrderStatus.SHIPPED
print(status.can_cancel()) # False
通过扩展Enum,你可以:
灵活新增状态,无需修改原有代码
封装复杂逻辑,告别满屏的if-else
统一管理常量,降低维护成本
动手试试:在你的下一个项目中,用枚举替换那些“魔法数字”,感受代码质的提升吧!
- 上一篇: Python简介与开发环境搭建详细教程
- 下一篇: 3个提升Python运行速度的方法,很实用
猜你喜欢
- 2025-05-30 学习Python的第二天之网络爬虫
- 2025-05-30 Markdown + 文档管理 + 静态网页生成,集大成的 Markdown 应用:MWeb
- 2025-05-30 Python编程环境跟工具搭建
- 2025-05-30 Python中的sitecustomize.py:揭秘运行时环境定制的终极武器
- 2025-05-30 3个提升Python运行速度的方法,很实用
- 2025-05-30 Python简介与开发环境搭建详细教程
- 258℃Python短文,Python中的嵌套条件语句(六)
- 258℃python笔记:for循环嵌套。end=""的作用,图形打印
- 257℃PythonNet:实现Python与.Net代码相互调用!
- 252℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 252℃Python实现字符串小写转大写并写入文件
- 108℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 83℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)