枚举是Python中一种特殊的数据类型,用于定义一组相关的常量集合,每个常量都有唯一的名称和对应的值,常用来表示固定的、不可随意修改的取值集合,比如订单状态、性别类型、错误码等场景。使用枚举可以避免直接在代码中写硬编码的常量,让代码的可读性和可维护性都得到提升。

枚举的基本概念
枚举的核心特点是成员固定、不可修改,每个枚举成员都有唯一的身份标识。在Python中,枚举通过enum模块实现,枚举类的每个实例就是枚举成员,不能直接修改成员的值,也不能随意新增成员,这保证了枚举取值的规范性。
比如我们需要表示一周的七天,不使用枚举时可能会用数字1到7代表,但是其他人看代码时很难直接知道1和7分别代表什么,使用枚举就可以明确每个取值的含义。
使用enum模块定义枚举
基础定义方式
最基础的枚举定义方式是继承enum.Enum类,然后直接定义类属性作为枚举成员,默认情况下枚举成员的值会从1开始自动递增。
from enum import Enum
# 定义星期枚举
class WeekDay(Enum):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 5
SATURDAY = 6
SUNDAY = 7
# 访问枚举成员
print(WeekDay.MONDAY) # 输出 WeekDay.MONDAY
print(WeekDay.MONDAY.value) # 输出 1
print(WeekDay.MONDAY.name) # 输出 MONDAY
自动赋值枚举
如果不想手动给每个枚举成员赋值,可以使用enum.auto()方法,它会自动为每个成员分配递增的整数值,从1开始。
from enum import Enum, auto
class Color(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
print(Color.RED.value) # 输出 1
print(Color.GREEN.value) # 输出 2
print(Color.BLUE.value) # 输出 3
自定义值的枚举
枚举成员的值不只能是整数,也可以是字符串、元组等其他类型,只需要给成员直接赋值对应的类型即可。
from enum import Enum
class OrderStatus(Enum):
PENDING = "pending" # 待支付
PAID = "paid" # 已支付
SHIPPED = "shipped" # 已发货
FINISHED = "finished" # 已完成
print(OrderStatus.PENDING.value) # 输出 pending
带方法的枚举
枚举类也可以定义普通方法,方便对枚举成员做额外的逻辑处理,比如根据枚举值获取对应的描述信息。
from enum import Enum
class Gender(Enum):
MALE = 1
FEMALE = 2
def get_desc(self):
if self == Gender.MALE:
return "男性"
else:
return "女性"
print(Gender.MALE.get_desc()) # 输出 男性
print(Gender.FEMALE.get_desc()) # 输出 女性
枚举的常见使用场景
- 表示固定的状态集合,比如订单状态、用户状态等,避免使用魔法数字。
- 定义类型标识,比如接口返回的错误码类型,每个错误码对应明确的含义。
- 作为函数的参数限制,比如某个函数只接受特定的几个取值,可以用枚举来约束入参。
枚举的常用操作
除了访问成员的name和value属性,枚举还支持遍历、通过值获取成员、通过名称获取成员等操作。
from enum import Enum
class Status(Enum):
SUCCESS = 200
ERROR = 500
NOT_FOUND = 404
# 遍历所有枚举成员
for status in Status:
print(status.name, status.value)
# 通过值获取枚举成员
print(Status(200)) # 输出 Status.SUCCESS
# 通过名称获取枚举成员
print(Status["SUCCESS"]) # 输出 Status.SUCCESS
需要注意的是,枚举成员是不可变的,不能修改已有成员的值,也不能给枚举类动态新增成员。如果尝试修改枚举成员的值,Python会直接抛出AttributeError错误。