Python enum模块提供标准枚举定义方式,支持名称/值属性、面向对象特性、@unique防重复、IntEnum/Flag扩展及自定义行为与序列化。
python 的 enum 模块提供了一种定义枚举类型的标准方式,让程序更清晰、安全、可维护。它不是简单的整数别名集合,而是真正的类,支持属性、方法、迭代、比较等面向对象特性。
基础用法:定义和访问枚举成员
使用 Enum 类继承即可定义枚举。每个枚举成员是该类的唯一实例,具有名称(name)和值(value)两个核心属性。
例如:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
>>> print(Color.RED)
Color.RED
>>> print(Color.RED.name)
RED
>>> print(Color.RED.value)
1
>>> print(Color(2))
Color.GREEN
- 枚举成员不可被重新赋值,保证常量语义
- 可通过
Color.RED、Color['RED']或Color(1)三种方式访问成员 - 重复的值(非名称)默认会创建别名,如
ALSO_RED = 1→ALSO_RED is Color.RED为True
避免别名:使用 @unique 装饰器
当需要确保所有枚举值互不相同时,应加上 @unique 装饰器。否则在定义含重复值的枚举时会抛出 ValueError。
立即学习“Python免费学习笔记(深入)”;
>>> from enum import Enum, unique
>>> @unique
>>> class Status(Enum):
... PENDING = 0
... RUNNING = 1
... DONE = 2
... FAILED = 2 # ← 触发 ValueError: duplicate values found
- 适合用于状态码、协议类型等要求“一值一意”的场景
- 装饰器仅检查
value,不影响同名不同值(这本身语法不允许)
增强功能:IntEnum 和 Flag 枚举
IntEnum 是 int 的子类,支持与整数的直接比较和运算;Flag 支持按位组合,适合权限、选项等多选场景。
>>> from enum import IntEnum, Flag, auto
>>> class Priority(IntEnum):
... LOW = 1
... MEDIUM = 2
... HIGH = 3
>>> Priority.HIGH > Priority.LOW # True
>>> class Permission(Flag):
... READ = auto()
... WRITE = auto()
... EXECUTE = auto()
>>> admin = Permission.READ | Permission.WRITE | Permission.EXECUTE
>>> Permission.READ in admin # True
-
auto()自动递增赋值,避免手动写数字,提高可维护性 -
Flag成员支持|、&、~等位操作,也支持in判断 - 注意:
IntEnum可能意外与普通整数混用,需谨慎设计 API 边界
实用技巧:自定义枚举行为和序列化
可以通过重写 __str__、__repr__ 或添加类方法来增强可读性;用 __members__ 获取全部成员,配合 json 模块可实现简单序列化。
>>> class HttpStatus(Enum):
... OK = (200, "Success")
... NOT_FOUND = (404, "Not Found")
... def __init__(self, code, phrase):
... self.code = code
... self.phrase = phrase
... def __str__(self):
... return f"{self.code} {self.phrase}"
>>> print(HttpStatus.OK) # 200 Success
>>> print(HttpStatus.OK.code) # 200
- 枚举类中定义的普通方法或属性,对每个成员都可用
- 若需 JSON 序列化,推荐定义
to_dict()方法或使用dataclasses配合Enum - 遍历所有成员:
for member in HttpStatus: ...或list(HttpStatus.__members__.values())










