当前位置: 首页 > 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.hskmm.com/?act=detail&tid=15999

相关文章:

  • Filter过滤器
  • 程序员的旅行神器:用AI提示词工程解决选择困难症
  • 修改人大金仓V8数据库时间
  • BUUCTF-babyheap_0ctf_2017题解(含详细过程与思路分析)
  • 油猴(Tampermonkey)插件从安装到使用
  • 【EF Core】框架底层的数据库连接管理
  • iNeuOS工业互联网操作系统,更新计量数据处理方式和在线报表,实现能源管理基础功能
  • React 展示Markdown内容 - 教程
  • 西电PCB设计指南第4章学习笔记
  • 图像处理去除噪点验证码的识别逻辑实践
  • Java文件上传和其他参数一起提交的案例
  • 三维模型非结构化网格生成
  • Windows 环境变量配置
  • Playwright MCP浏览器自动化指南 - 详解
  • 完整教程:【C++】STL简介+编码表+string引入
  • SpringBootMVC相关内容
  • 基于节流的流水线并行推理优化——gLLM
  • Corral the Cows
  • HarmonyOS 5 通知与语音能力开发实战:从消息推送到智能语音交互
  • HarmonyOS 5 Native与ArkTS混合开发实战:跨语言高性能组件开发
  • 实战:基于HarmonyOS 5构建分布式聊天通讯应用
  • Java-Eclipse使用-多维数组的使用
  • HarmonyOS 5 动画开发实战:从基础动效到高级交互动画
  • HarmonyOS 5 高级动效实战:粒子系统、路径动画与物理动效开发
  • 从范德蒙德矩阵聊开去.
  • HarmonyOS 5 动画性能优化深度解析:从原理到实践
  • HarmonyOS 5 性能优化全攻略:从启动加速到内存管理
  • #字符串执行函数——eval()、exec()和compile()详解
  • HarmonyOS 5 网络编程与数据存储实战:从RESTful API到本地持久化
  • 【光照】[环境光ambient]以UnityURP为例