一、介绍
Python标准库中的enum
模块提供了一种创建枚举类型的方式,枚举类型是一种特殊的类,用于定义一组命名的常量。以下是enum
模块的主要特点和实现方式:
-
基本用法:
- 使用
Enum
类可以定义一个枚举类型,枚举成员是类的属性,每个成员有唯一的名称和值。 - 枚举成员的值可以是任意类型,但通常是整数或字符串。
- 使用
-
枚举成员:
- 枚举成员是唯一的,不能重复定义。
- 可以通过名称或值访问枚举成员。
-
自动赋值:
- 使用
auto()
函数可以自动为枚举成员分配值(通常是递增的整数)。
- 使用
-
功能扩展:
IntEnum
:枚举成员的值必须是整数,并且可以与整数直接比较。Flag
和IntFlag
:支持按位运算的枚举类型,适用于标志位操作。
-
迭代和比较:
- 枚举类型是可迭代的,可以遍历所有成员。
- 枚举成员支持身份比较(
is
)和相等比较(==
),但不支持大小比较(除非使用IntEnum
)。
-
别名和唯一性:
- 可以定义别名(多个名称对应同一个值),但默认情况下不允许重复值(除非使用
@unique
装饰器禁用别名)。
- 可以定义别名(多个名称对应同一个值),但默认情况下不允许重复值(除非使用
from enum import Enum, auto, unique@unique class Color(Enum):RED = 1GREEN = 2BLUE = 3# YELLOW = 1 # 会报错,因为值重复且使用了@unique装饰器class Status(Enum):PENDING = auto()RUNNING = auto()COMPLETED = auto()# 访问枚举成员 print(Color.RED) # 输出: Color.RED print(Color.RED.name) # 输出: RED print(Color.RED.value) # 输出: 1# 遍历枚举 for status in Status:print(status) """ Status.PENDING Status.RUNNING Status.COMPLETED """
enum
模块的枚举类提供了清晰、安全的方式管理常量,避免了魔法数字和字符串的使用,提高了代码的可读性和可维护性。
二、多重继承int、str
1、单继承Enum
特点:
- 类型安全:枚举成员是独立的枚举对象,不与整数、字符串等混用。
- 禁止整数、字符串的操作:
Color.RED + 1
会报错(不支持运算)。 - 严格比较:
返回Color.RED
== 1False
(需显式比较.value
)。
适用场景:需要强类型约束,避免枚举值与数字、字符串混淆时。
from enum import Enumclass Color(Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class Status(Enum):"""状态枚举类示例"""PENDING = 'pending'RUNNING = 'running'COMPLETED = 'completed'""" 枚举成员是独立的枚举对象,不与整数、字符串混用。 需要使用时,要通过 value 获取实际的值才能进行使用 """ print(Color.RED == 1) # False print(Color.RED.value == 1) # 需要通过 value 获取实际的值,True print(Status.RUNNING == 'running') # False print(Status.RUNNING.value == 'running') # 需要通过 value 获取实际的值,True
2、int、str和Enum多重继承
特点:
- 整数兼容:枚举成员可当整数、字符串使用(
输出
+ 1Color.RED
2
)。 - 隐式比较:
返回
== 1Color.RED
True
。 - 序列化友好:直接存储为整数、字符串(如JSON序列化)。
适用场景:需要与数字交互(如数据库状态码、协议字段)。
from enum import Enumclass Color(int, Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class Status(str, Enum):"""状态枚举类示例"""PENDING = 'pending'RUNNING = 'running'COMPLETED = 'completed'""" 有没有通过 value 取值都能正常使用 """ print(Color.RED) # 类型还是Color.RED,但是继承了 int,实际使用的时候是 int 类型,不需要通过 value 获取值 print(Color.RED == 1) # 没有通过 value 但是继承了 int:True print(Color.RED.value == 1) # 通过 value 获取值,Trueprint(Status.RUNNING) # 类型还是Status.RUNNING,但是继承了 str,实际使用的时候是 str 类型,不需要通过 value 获取值 print(Status.RUNNING == 'running') # 没有通过 value 但是继承了 str:True print(Status.RUNNING.value == 'running') # 通过 value 获取值,True
关键区别总结
特性 | 纯Enum | int + Enum |
---|---|---|
成员类型 | 枚举对象 | 枚举对象 + 整数 |
数学运算支持 | ❌ 报错 | ✅ 支持 |
与整数直接比较 | ❌ 需用.value |
✅ 直接比较 |
序列化为数字 | ❌ 需手动处理 | ✅ 自动转为整数 |
根据需求选择:强类型用纯Enum
,需数字兼容则加int
。