摘要: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、 值无需连续
枚举值可以是任意类型(字符串、元组等),不一定用数字:
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
✅ 统一管理常量,降低维护成本
来源:信息科技云课堂