python enum模块提供命名常量的安全定义方式,成员为类实例,具name/value属性且防非法赋值;支持enum继承、auto()自增、函数式创建;可按名/值访问,含intenum、strenum、flag等变种;需注意命名规范、不可继承扩展及不可变性。

Python 的 enum 模块提供了一种清晰、安全的方式来定义一组命名常量,避免用魔法数字或字符串硬编码。它不是语法糖,而是真正的类型系统支持——成员是类的实例,有名字(name)、值(value),还能防止非法赋值。
基础定义与创建方式
最常用的是继承 Enum 类:
- 每个成员必须有唯一名称和显式值(如
RED = 1);值可以是任意类型,但通常为整数或字符串 - 支持
auto()自动生成递增值(前一个成员值 + 1),适合纯序号场景 - 也支持函数式创建:
Color = Enum('Color', ['RED', 'GREEN', 'BLUE']),此时值默认从 1 开始编号
访问与使用枚举成员
成员不是普通变量,而是带属性的对象:
-
Color.RED→ 获取成员对象本身 -
Color.RED.name→ 返回字符串'RED' -
Color.RED.value→ 返回关联值(如1) -
Color(1)→ 通过值反查成员(等价于Color.RED) -
Color['RED']→ 通过名称字符串查找成员
常用变种枚举类型
不同业务场景推荐不同基类:
立即学习“Python免费学习笔记(深入)”;
-
IntEnum:继承自
int,成员可直接参与数值运算和比较(比如 HTTP 状态码判断Status.OK > 0或Status.OK + 100) -
StrEnum:继承自
str,成员可直接当字符串用(如权限标识Role.ADMIN == "admin",支持.upper()等方法) -
Flag:支持位运算,适合权限组合(如
READ | WRITE),成员可按位“叠加”和“检测”
实用技巧与避坑提醒
实际开发中容易忽略的关键点:
- 枚举类内部不能定义普通方法或属性(除非用特殊写法如
@property),否则会干扰成员注册 - 成员名必须全大写(官方建议),避免与方法名冲突;重复定义同名成员会报错
- 不支持直接继承扩展已有枚举(如第三方库里的
OrderStatus),但可通过新建枚举并复用原值来兼容 - 枚举成员不可变,也不能被修改或新增——这是保障类型安全的核心设计









