Python中定义Enum需继承enum.Enum,成员值唯一不可变;访问用Color.RED(属性)、Color["RED"](名称查)、Color(1)(值查);序列化需转.name或.value,禁止直接json.dumps。

Python中定义Enum枚举类的基本写法
直接继承enum.Enum即可创建强类型枚举,每个成员自动获得唯一值和名称,且不可被修改或重复赋值。
常见错误是把枚举值写成字符串字面量却没加引号,导致被当成变量名报NameError;或者用=给枚举成员赋值时用了未定义的变量。
- 推荐写法:
from enum import Enum class Color(Enum): RED = 1 GREEN = 2 BLUE = 3 - 也支持字符串值:
RED = "red"、GREEN = "green",但要注意此时不能用int()直接转,得用.value取值 - 若想让枚举成员可直接作为字符串使用(比如日志输出),可继承
str, Enum,此时Color.RED == "red"为True
访问Enum成员的三种常用方式及区别
枚举成员不是普通变量,访问方式错一个就容易抛KeyError或返回None。
最常混淆的是Color["RED"]、Color.RED和Color(1)——它们分别对应“按名称查”、“按属性查”、“按值查”,三者行为不同且不互通。
-
Color.RED:标准属性访问,返回Color.RED对象,有.name和.value属性 -
Color["RED"]:通过字符串名称查找,若名称不存在抛KeyError;适合从配置或用户输入动态获取 -
Color(1):通过整数值反查,若值不存在抛ValueError;注意:如果枚举值是字符串(如"red"),就不能用Color("red"),会报错
避免Enum被意外实例化或修改的关键约束
Python的Enum默认禁止在运行时新增成员、修改已有成员值,这是它比普通类更安全的核心原因。但有些写法会绕过这个保护,导致逻辑出错。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
典型陷阱是误用__members__手动更新,或在类定义外对Color.RED重新赋值(虽然语法不报错,但实际不会生效)。
- 枚举类本身不可被实例化:
Color()会直接抛TypeError - 成员值不可被覆盖:
Color.RED = 999看似成功,但下次访问Color.RED仍是原值,只是往类命名空间塞了个新变量 - 若需扩展枚举(比如插件系统动态注册),应改用
enum.Flag或自定义元类,不要强行修改__members__
与数据库/JSON交互时处理Enum的序列化问题
直接json.dumps(Color.RED)会报TypeError: Object of type Color is not JSON serializable,因为JSON标准不认Python枚举。
常见做法是统一转成.name或.value,但必须前后一致,否则数据库存了"RED",代码里却按1去查,就会匹配失败。
- 存数据库建议用
.name(语义清晰、可读性强)或.value(节省空间、便于排序),但别混用 - 转JSON时可用
default参数:json.dumps(obj, default=lambda x: x.name if isinstance(x, Enum) else x)
- 从JSON加载后,务必用
Color[data]或Color(data)显式转换回枚举对象,不要直接拿字符串当枚举用
枚举值一旦定义就该视为契约,后续增删成员可能影响数据库迁移、API兼容性或前端映射逻辑,这点比普通常量严格得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










