page contents

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

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

attachments-2025-05-U67vYXmw682e7d3cef2c4.jpg为什么你需要关注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'

优势:

避免直接操作数字,代码一目了然

防止无效值(比如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编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-05-22 09:26
  • 阅读 ( 87 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

2172 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2172 文章
  3. Pack 1335 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章