IntEnum 与 Flag
使用整数枚举和标志枚举
IntEnum 与 Flag 是 CoddyKit 上的免费 Python Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
超越普通枚举
enum 模块提供了专用的基类。IntEnum 成员的行为类似整数,而标志枚举成员可以使用按位运算符进行组合。当普通 Enum 的限制过多时,它们可以满足相应需求。
普通 Enum 不是整数
普通 Enum 成员不能与其整数值互换使用。将它与数字进行比较会返回 False。
from enum import Enum
class Level(Enum):
LOW = 1
HIGH = 2
print(Level.LOW == 1)IntEnum 按整数进行比较
IntEnum 成员就是整数,因此它与对应的数值相等,并支持排序。
from enum import IntEnum
class Level(IntEnum):
LOW = 1
HIGH = 2
print(Level.LOW == 1)
print(Level.LOW < Level.HIGH)算术运算中的 IntEnum
由于成员是真正的整数,您可以在数学运算和索引中使用它们。当某个值确实需要与数值代码互操作时,请使用这种方式。
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 5
HIGH = 10
print(Priority.HIGH + 1)
print(Priority.MEDIUM * 2)对 IntEnum 成员排序
由于 IntEnum 支持排序,成员列表无需额外的键函数即可按值排序。
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 5
HIGH = 10
for p in sorted([Priority.HIGH, Priority.LOW, Priority.MEDIUM]):
print(p.name)使用标志枚举表示可组合选项
Flag 枚举用于表示需要组合的值。请分配 2 的幂,使每个成员各占据一个独立的位。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
print(Permission.READ)
print(Permission.READ.value)使用 | 组合标志
使用按位或运算符 | 将多个标志组合成一个复合值。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
print(access)使用 in 测试成员关系
使用 in 运算符检查某个标志是否已设置,该运算符会为您执行按位测试。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
print(Permission.READ in access)
print(Permission.EXECUTE in access)交集与移除
使用 &(AND)组合标志以查找共同的位,并使用 & 与补码 ~ 运算来移除标志。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
still = access & ~Permission.WRITE
print(still)使用 IntFlag 表示整数标志
IntFlag 结合了这两种特性:标志可以组合,同时又表现得像普通整数。当您需要与 C API 交互或处理以数字存储的位掩码时,它非常有用。
from enum import IntFlag, auto
class Mode(IntFlag):
R = 4
W = 2
X = 1
m = Mode.R | Mode.W
print(int(m))遍历组合标志
遍历组合的 Flag 值时,会生成其中包含的每个独立标志,这对于列出活动选项非常方便。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.EXECUTE
for p in access:
print(p.name)快速检查
为什么要选择 Flag 枚举,而不是普通的 Enum?
回顾
您学会了整数枚举和标志枚举。
IntEnum成员的行为类似整数,并支持排序和算术运算。Flag成员可以使用|、&和~进行组合,并使用in进行测试。IntFlag混合了这两种行为。- 为标志值使用 2 的幂。
常见问题解答
「IntEnum 与 Flag」课时是免费的吗?
是的 — 「IntEnum 与 Flag」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「IntEnum 与 Flag」这节课中我会学到什么?
使用整数枚举和标志枚举 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「IntEnum 与 Flag」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 枚举类
- IntEnum 与 Flag
- NamedTuple 基础
- typing.NamedTuple