Enum 类继承可创建类型安全、可迭代枚举,但需避免赋值为 0 或 None;应按需选用 Enum 或 IntEnum,禁用 auto() 混搭非整数类型;迭代得成员对象,须用 .name/.value 访问;JSON 序列化需显式转换,不可用 str;成员不可变,动态修改应换 dataclass。

直接用 Enum 类继承就能创建类型安全、可迭代的枚举,但必须避免常见误用:比如给枚举成员赋值为 0 或 None,会导致 bool(member) 为 False,破坏逻辑判断。
定义基础枚举类时必须显式指定值类型
Python 的 Enum 默认允许任意类型作为成员值,但类型安全依赖你主动约束。如果希望所有成员都是整数且互不重复,就该用 IntEnum;如果只是命名常量,Enum 足够,但别混用字符串和数字。
-
Enum成员值可以是任意对象(包括str、int、tuple),但不同值类型无法比较:Color.RED == 1永远为False - 想支持
==与整数比较?改用IntEnum,它继承自int,所以Status.ACTIVE == 1返回True - 避免用
auto()配合非整数类型——auto()生成的是递增整数,若后续手动设str值,会破坏序列性
迭代枚举成员时注意顺序和过滤逻辑
遍历 MyEnum 得到的是枚举成员对象(如 Color.RED),不是名称或值。需要名称用 .name,需要值用 .value,别直接当字符串用。
-
for e in Color:→ 迭代的是Color.RED、Color.GREEN等实例,不是字符串"RED" - 想按定义顺序迭代?没问题,
Enum保证成员声明顺序即迭代顺序;但若用了@unique,重复值会抛ValueError - 别在循环里写
if e == "RED":—— 这永远不成立,应写if e.name == "RED":或if e is Color.RED:
处理 JSON 序列化时值类型决定编码方式
默认 json.dumps() 无法序列化枚举成员,必须显式转换。怎么转,取决于你当初定义时选的值类型。
立即学习“Python免费学习笔记(深入)”;
- 若用
IntEnum,可直接json.dumps(obj, default=int),因为成员是int子类 - 若用普通
Enum且值为字符串,推荐default=lambda x: x.value if isinstance(x, Enum) else x - 千万别用
default=str—— 它返回"Color.RED"这种带类名的字符串,不是纯值,下游解析会出错
最容易被忽略的是:枚举成员一旦创建就不能修改 .name 或 .value,但很多人试图用 setattr(e, 'value', ...) 绕过限制,结果静默失败。真要动态行为,说明不该用 Enum,该换 dataclass 或普通类。


















