当前位置: 首页 > news >正文

Python标准库enum模块实现枚举类

一、介绍

Python标准库中的enum模块提供了一种创建枚举类型的方式,枚举类型是一种特殊的类,用于定义一组命名的常量。以下是enum模块的主要特点和实现方式:

  1. 基本用法‌:

    • 使用Enum类可以定义一个枚举类型,枚举成员是类的属性,每个成员有唯一的名称和值。
    • 枚举成员的值可以是任意类型,但通常是整数或字符串。
  2. 枚举成员‌:

    • 枚举成员是唯一的,不能重复定义。
    • 可以通过名称或值访问枚举成员。
  3. 自动赋值‌:

    • 使用auto()函数可以自动为枚举成员分配值(通常是递增的整数)。
  4. 功能扩展‌:

    • IntEnum:枚举成员的值必须是整数,并且可以与整数直接比较。
    • FlagIntFlag:支持按位运算的枚举类型,适用于标志位操作。
  5. 迭代和比较‌:

    • 枚举类型是可迭代的,可以遍历所有成员。
    • 枚举成员支持身份比较(is)和相等比较(==),但不支持大小比较(除非使用IntEnum)。
  6. 别名和唯一性‌:

    • 可以定义别名(多个名称对应同一个值),但默认情况下不允许重复值(除非使用@unique装饰器禁用别名)。
from enum import Enum, auto, unique@unique
class Color(Enum):RED = 1GREEN = 2BLUE = 3# YELLOW = 1  # 会报错,因为值重复且使用了@unique装饰器class Status(Enum):PENDING = auto()RUNNING = auto()COMPLETED = auto()# 访问枚举成员
print(Color.RED)  # 输出: Color.RED
print(Color.RED.name)  # 输出: RED
print(Color.RED.value)  # 输出: 1# 遍历枚举
for status in Status:print(status)
"""
Status.PENDING
Status.RUNNING
Status.COMPLETED
"""

enum模块的枚举类提供了清晰、安全的方式管理常量,避免了魔法数字和字符串的使用,提高了代码的可读性和可维护性。

 

二、多重继承int、str

1、单继承Enum

特点:

  • 类型安全‌:枚举成员是独立的枚举对象,不与整数、字符串等混用。
  • 禁止整数、字符串的操作‌:Color.RED + 1会报错(不支持运算)。
  • 严格比较‌:Color.RED == 1 返回 False(需显式比较.value)。

适用场景‌:需要强类型约束,避免枚举值与数字、字符串混淆时。

from enum import Enumclass Color(Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class Status(Enum):"""状态枚举类示例"""PENDING = 'pending'RUNNING = 'running'COMPLETED = 'completed'"""
枚举成员是独立的枚举对象,不与整数、字符串混用。
需要使用时,要通过 value 获取实际的值才能进行使用
"""
print(Color.RED == 1)  # False
print(Color.RED.value == 1)  # 需要通过 value 获取实际的值,True
print(Status.RUNNING == 'running')  # False
print(Status.RUNNING.value == 'running')  # 需要通过 value 获取实际的值,True

2、int、str和Enum多重继承

特点:

  • 整数兼容‌:枚举成员可当整数、字符串使用(Color.RED + 1 输出 2)。
  • 隐式比较‌:Color.RED == 1 返回 True
  • 序列化友好‌:直接存储为整数、字符串(如JSON序列化)。

适用场景‌:需要与数字交互(如数据库状态码、协议字段)。

from enum import Enumclass Color(int, Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class Status(str, Enum):"""状态枚举类示例"""PENDING = 'pending'RUNNING = 'running'COMPLETED = 'completed'"""
有没有通过 value 取值都能正常使用
"""
print(Color.RED)  # 类型还是Color.RED,但是继承了 int,实际使用的时候是 int 类型,不需要通过 value 获取值
print(Color.RED == 1)  # 没有通过 value 但是继承了 int:True
print(Color.RED.value == 1)  # 通过 value 获取值,Trueprint(Status.RUNNING)  # 类型还是Status.RUNNING,但是继承了 str,实际使用的时候是 str 类型,不需要通过 value 获取值
print(Status.RUNNING == 'running')  # 没有通过 value 但是继承了 str:True
print(Status.RUNNING.value == 'running')  # 通过 value 获取值,True

关键区别总结

特性Enumint + Enum
成员类型 枚举对象 枚举对象 + 整数
数学运算支持 ❌ 报错 ✅ 支持
与整数直接比较 ❌ 需用.value ✅ 直接比较
序列化为数字 ❌ 需手动处理 ✅ 自动转为整数

根据需求选择:强类型用纯Enum,需数字兼容则加int

 

http://www.rkmt.cn/news/11035.html

相关文章:

  • 修改人大金仓V8数据库时间
  • 油猴(Tampermonkey)插件从安装到使用
  • React 展示Markdown内容 - 教程
  • 图像处理去除噪点验证码的识别逻辑实践
  • Java文件上传和其他参数一起提交的案例
  • Windows 环境变量配置
  • 【含文档+PPT+源码】基于GPT+SpringBoot的个人健康管理与咨询架构设计与建立
  • HarmonyOS 5 Native与ArkTS混合开发实战:跨语言高性能组件开发
  • Java-Eclipse使用-多维数组的使用
  • HarmonyOS 5 动画开发实战:从基础动效到高级交互动画
  • HarmonyOS 5 动画性能优化深度解析:从原理到实践
  • vue3 + antd +ts cron 选择器使用
  • #字符串执行函数——eval()、exec()和compile()详解
  • OceanBase 向量数据库使用指南
  • 【光照】[环境光ambient]以UnityURP为例
  • 实用指南:玳瑁的嵌入式日记---0923(ARM)
  • 个人博客搭建记录【hexo】
  • 喵喵喵
  • HarmonyOS 5分布式数据同步实战:跨设备待办事项应用
  • 深入理解HarmonyOS 5的AVSession:构建跨设备媒体播放器
  • 润生软件简介:以“重构与共生”引领商业未来
  • 安装pyautogui时与setuptool时冲突报错-module setuptools.dist has no attribute check_test_suite
  • 牛客周赛 Round 110 题解
  • 靶场1
  • 贝叶斯定理简单解释
  • 【CV】GAN代码解析:base_model.py
  • 学校站群框架如何开发插件实现Word图片的批量上传与编辑?
  • HarmonyOS事件订阅与通知:后台事件处理
  • HarmonyOS后台任务管理:短时与长时任务实战指南
  • Browser Use调用浏览器入门