让Python枚举更强大!教你玩转Enum扩展

360影视 日韩动漫 2025-05-14 09:16 1

摘要:from enum import Enumclass OrderStatus(Enum): CREATED = {"code": 10, "desc": "订单已创建"} PAID = {"code": 20, "desc": "已支付"} SHIPPED =

为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?

if status == 1: print("开始处理")elif status == 2: print("处理中")elif status == 3: print("已完成")

这些“魔法数字”虽然能用,但可读性和维护性极差。 Python 3 的Enum(枚举类)就是为此而生——它能将数字变成有意义的符号,让代码瞬间“说人话”。

定义第一个枚举类

from enum import Enumclass OrderStatus(Enum): PENDING = 1 # 待处理 PROCESSING = 2 # 处理中 COMPLETED = 3 # 已完成

用法示例

current_status = OrderStatus.PROCESSINGprint(current_status.value) # 输出:2print(current_status.name) # 输出:'PROCESSING'

优势

场景

现有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

场景

订单状态需要关联更多信息,比如状态描述、对应的操作按钮。

解决方案:在子类中添加方法!

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.CANCELLEDprint(status.get_action) # 输出:"联系客服申诉"

1、成员名冲突
子类成员名若与父类重复,会直接报错!确保名称唯一。

2、 值无需连续
枚举值可以是任意类型(字符串、元组等),不一定用数字:

class Priority(Enum): HIGH = (1, "红色") MEDIUM = (2, "黄色") LOW = (3, "绿色")

3、慎用auto
自动赋值虽方便,但扩展时可能导致值重复,建议显式定义。

场景:电商订单状态流转

from enum import Enumclass 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.PAIDprint(status.can_cancel) # Truestatus = OrderStatus.SHIPPEDprint(status.can_cancel) # False

通过扩展Enum,你可以:
灵活新增状态,无需修改原有代码
封装复杂逻辑,告别满屏的if-else
✅ 统一管理常量,降低维护成本

来源:信息科技云课堂

相关推荐