python的enum通过int进行初始化
在 Python 中,enum 模块提供了多种方式通过整数(int)来初始化和使用枚举。主要涉及以下几种场景:
1. 基础 Enum 通过整数值查找成员
对于标准的 Enum 类,你可以直接使用整数值作为参数来获取对应的枚举成员。这是最常用的“通过 int 初始化/获取”的方式。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 通过整数值 1 获取枚举成员
member = Color(1)
print(member) # 输出: Color.RED
print(member.name) # 输出: 'RED'
print(member.value) # 输出: 1
注意:标准的 Enum 成员虽然拥有整数值,但它们不等于整数。
print(Color.RED == 1) # False
print(Color.RED is Color(1)) # True
2. 使用 IntEnum 使枚举行为像整数
如果你希望枚举成员可以直接与整数进行比较、运算,或者在需要整数的地方直接替代整数使用,应继承 IntEnum。IntEnum 是 int 的子类。
from enum import IntEnum
class Status(IntEnum):
OK = 200
NOT_FOUND = 404
ERROR = 500
# IntEnum 成员可以直接与整数比较
print(Status.OK == 200) # True
print(Status.OK > 100) # True
# 可以进行数学运算
print(Status.OK + 100) # 300
# 可以通过整数初始化
status = Status(200)
print(status) # Status.OK
3. 使用 auto() 自动分配整数值
如果不需要指定具体的整数值,可以使用 auto() 辅助类,它会自动为成员分配从 1 开始的递增整数。
from enum import Enum, auto
class Priority(Enum):
LOW = auto() # 1
MEDIUM = auto() # 2
HIGH = auto() # 3
print(Priority.LOW.value) # 1
print(Priority.HIGH.value) # 3
4. 自定义 __new__ 处理复杂整数初始化
如果需要为枚举成员添加额外的属性,同时保持基于整数的初始化逻辑,可以重写 __new__ 方法。这在 IntEnum 中尤为常见。
from enum import IntEnum
class Color(IntEnum):
RED = 1, "红色"
GREEN = 2, "绿色"
BLUE = 3, "蓝色"
def __new__(cls, value, label):
# 创建实例并设置值
obj = int.__new__(cls, value)
obj._value_ = value
obj.label = label
return obj
# 通过整数初始化
c = Color(1)
print(c) # Color.RED
print(c.label) # 红色
print(c == 1) # True (因为是 IntEnum)
总结
- 仅用于常量定义:使用
Enum,通过Color(1)方式由整数获取成员。 - 需要与整数互操作(如比较、运算):使用
IntEnum。 - 自动赋值:使用
auto()。 - 额外属性:结合
IntEnum和__new__方法实现。
推荐使用 IntEnum 当且仅当你确实需要枚举成员表现得像整数时(例如 HTTP 状态码、权限位等),否则标准 Enum 能提供更好的类型安全性,防止枚举成员与无关整数意外相等。
