当前位置: 首页 > news >正文

python的enum通过int进行初始化

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 使枚举行为像整数

如果你希望枚举成员可以直接与整数进行比较、运算,或者在需要整数的地方直接替代整数使用,应继承 IntEnumIntEnumint 的子类。

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 能提供更好的类型安全性,防止枚举成员与无关整数意外相等。