让Python枚举更强大!3个技巧教你玩转Enum扩展

360影视 国产动漫 2025-05-22 16:41 2

摘要:classPriority(Enum):HIGH = (1, "红色")MEDIUM = (2, "黄色")LOW = (3, "绿色")

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

if status == 1:
print("开始处理")
elif status == 2:
print("处理中")
elif status == 3:
print("已完成")
这些“魔法数字”虽然能用,但可读性和维护性极差。 Python 3 的Enum(枚举类)就是为此而生——它能将数字变成有意义的符号,让代码瞬间“说人话”。

一、基础操作:5分钟上手Python枚举

定义第一个枚举类

from enum import Enum

classOrderStatus(Enum):
PENDING = 1# 待处理
PROCESSING = 2# 处理中
COMPLETED = 3# 已完成

用法示例

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

优势

避免直接操作数字,代码一目了然防止无效值(比如status=4会直接报错)

场景

现有OrderStatus需要新增状态CANCELLED=4,但不想修改原代码(比如枚举类来自第三方库)。

解决方案:虽然无法直接继承,但可通过组合枚举成员实现:

classExtendedOrderStatus(Enum):
# 直接包含原成员
PENDING = OrderStatus.PENDING.value # 待处理
PROCESSING = OrderStatus.PROCESSING.value # 处理中
COMPLETED = OrderStatus.COMPLETED.value # 已完成

CANCELLED = 4# 新增“已取消”状态
REFUNDED = 5# 新增“已退款”状态
# 使用新状态
print(ExtendedOrderStatus.CANCELLED.value) # 输出:4

三、进阶技巧2:给枚举“添加超能力”

场景

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

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

classExtendedOrderStatus(OrderStatus):
CANCELLED = 4
REFUNDED = 5

defget_action(self):
# 为不同状态返回操作提示
if self == ExtendedOrderStatus.CANCELLED:
return"联系客服申诉"
elif self == ExtendedOrderStatus.REFUNDED:
return"查看退款详情"
else:
return super.get_action # 调用父类逻辑(如有)

调用示例

classExtendedOrderStatus(Enum):
# 直接包含原成员
PENDING = OrderStatus.PENDING.value # 待处理
PROCESSING = OrderStatus.PROCESSING.value # 处理中
COMPLETED = OrderStatus.COMPLETED.value # 已完成

CANCELLED = 4# 新增“已取消”状态
REFUNDED = 5# 新增“已退款”状态

defget_action(self):
# 为不同状态返回操作提示
if self == ExtendedOrderStatus.CANCELLED:
return"联系客服申诉"
elif self == ExtendedOrderStatus.REFUNDED:
return"查看退款详情"
else:
return super.get_action # 调用父类逻辑(如有)

status = ExtendedOrderStatus.CANCELLED
print(status.get_action) # 输出:"联系客服申诉"

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

classPriority(Enum):
HIGH = (1, "红色")
MEDIUM = (2, "黄色")
LOW = (3, "绿色")
慎用auto自动赋值虽方便,但扩展时可能导致值重复,建议显式定义。

五、实战案例:枚举在业务中的妙用

场景:电商订单状态流转

from enum import Enum
classOrderStatus(Enum):
CREATED = {"code": 10, "desc": "订单已创建"}
PAID = {"code": 20, "desc": "已支付"}
SHIPPED = {"code": 30, "desc": "已发货"}

defcan_cancel(self):
# 判断当前状态是否允许取消
return self in (OrderStatus.CREATED, OrderStatus.PAID)

status = OrderStatus.PAID
print(status.can_cancel) # True

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

动手试试:在你的下一个项目中,用枚举替换那些“魔法数字”,感受代码质的提升吧!

推荐好书:这是鸢尾花书系中最实用最基础的一本,本书关注于与机器学习相关的Python编程,入门人工智能编程,这一本是很不错的选择。让读者可以通过Python语言更好地了解与人工智能相关的数学和应用。

来源:慧德教教育

相关推荐