枚举是一种数据类型,在编程中用于表示一组相关的常量。枚举中的每个常量都有一个名称和一个对应的值,可以用于增强代码的可读性和可维护性。在Python中,枚举是由enum模块提供的,而不是Python提供专用的枚举语法。关于enum模块介绍见:enum。如需详细了解Python的enum模块,参见文章:Python enum和枚举(enum)介绍。

文章目录

  • 1 语法介绍
  • 2 参考

1 语法介绍

基础示例

# 引入 Enum 模块,用于创建枚举from enum import Enum# 创建一个枚举类Color,从Python内置的枚举类Enum继承class Color(Enum):# 定义 RED 数值为 1RED = 1# 定义 GREEN 数值为 2GREEN = 2# 定义 BLUE 数值为 3BLUE = 3col = Color.RED# 输出Color.REDprint(col)if col == Color.RED:# 判断 col 是否为 Color.RED,若是则输出 "Red"print("Red")# 输出 Color 枚举类的所有成员:[, , ]print(list(Color))# 判断col是否为Color类型print(isinstance(col, Color))# 输出 col 的类型:print(type(col))# 输出 col 的字符串表示形式:print(repr(col))# 通过 Color['RED'] 获取 Color.REDprint(Color['RED'])# 通过 Color(1) 获取 Color.REDprint(Color(1))
Color.REDRed[, , ]TrueColor.REDColor.RED

函数式API创建枚举类

# 引入枚举类型from enum import Enum# 使用functional API创建枚举类,定义三个枚举常量,分别为 RED, GREEN, BLUE,从数字2开始标号Color = Enum('Color', 'RED GREEN BLUE', start=2)# 或使用以下形式# Color = Enum('Color', [('RED', 1), ('BLUE', 2), ('GREEN', 3)])# 将 col 设为 GREENcol = Color.GREEN# 输出 col 的值:Color.GREENprint(col)# 比较 col 和 GREEN 是否相等,如果相等则输出 "Green"if col == Color.GREEN:print("Green")# 遍历枚举for color in Color:print(color)# 使用 name 和 value 属性获取枚举名称和值for color in Color:print(color.name, color.value)# 使用 __members__ 属性获取枚举类型 Color 中的所有枚举常量和名称for name, member in Color.__members__.items():print(name, member)
Color.GREENGreenColor.REDColor.GREENColor.BLUERED 2GREEN 3BLUE 4RED Color.REDGREEN Color.GREENBLUE Color.BLUE

自动赋值

# 导入枚举和自动赋值模块from enum import Enum, auto# 定义一个颜色的枚举类class Color(Enum):# 自动赋值,RED 的值为 1,后面的枚举类值依次加 1RED = auto()BLUE = auto()GREEN = auto()# 遍历 Color 枚举类,输出每个枚举值for color in Color:print(color)# 遍历 Color 枚举类,输出每个枚举值的名称和值for color in Color:print(color.name, color.value)
Color.REDColor.BLUEColor.GREENRED 1BLUE 2GREEN 3

异类值

from enum import Enum# 枚举成员的值类型可以不一样,但是非常不推荐这样做class UserResponse(Enum):YES = 1NO = "No"MAYBE = "Maybe"print(list(UserResponse))
[, , ]

混合枚举

from enum import Enum# 通过多重继承创建支持整数比较的枚举class Size(int, Enum):S = 1M = 2L = 3XL = 4print(Size.S > Size.M)
False
# 实现和上述代码一样的功能from enum import IntEnum# 通过IntEnum创建支持整数比较的枚举class Size(IntEnum):S = 1M = 2L = 3XL = 4print(Size.S > Size.M)
False

强制唯一值

from enum import Enum, unique# 当成员值不唯一,如果不添加unique装饰器,则代码运行成功,但只保留第一个出现具有相同值的成员。# 如果添加unique,则运行报错# @uniqueclass Color(Enum):RED = 1GREEN = 2BLUE = 3ORANGE = 3WHITE = 3for color in Color:print(color)
Color.REDColor.GREENColor.BLUE

基于位掩码的枚举类型enum.Flag

from enum import IntFlag, Flag, auto# 创建基于位掩码的枚举类型,注意成员值为2的幂,最好不要自定义# 如果想创建整数枚举继承IntFlag即可class Permissions(Flag):READ = auto()# 定义读权限WRITE = auto()# 定义写权限EXECUTE = auto()# 定义执行权限DELETE = auto()# 定义删除权限# 使用 name 和 value 属性获取枚举名称和值# 可以看到各个成员的值是2的幂for p in Permissions:print(p.name, p.value)# 使用枚举成员perms_rw = Permissions.READ | Permissions.WRITE# 用户拥有读和写权限# 可以看到perms_rw的值为3print(perms_rw.name,perms_rw.value)# 检查是否有某个权限# 使用&运算符来判断一个枚举值中是否包含某个特定的枚举值if perms_rw & Permissions.READ:# 如果用户拥有读权限print("用户拥有读权限")if perms_rw & Permissions.WRITE:# 如果用户拥有写权限print("用户拥有写权限")if perms_rw & Permissions.EXECUTE:# 如果用户拥有执行权限print("用户拥有执行权限") # 遍历所有权限for perm in Permissions: print(perm)
READ 1WRITE 2EXECUTE 4DELETE 8None 3用户拥有读权限用户拥有写权限Permissions.READPermissions.WRITEPermissions.EXECUTEPermissions.DELETE

2 参考

  • enum
  • Python enum
  • 枚举(enum)介绍