一、简介
枚举是一种数据类型,在编程中用于表示一组相关的常量。枚举中的每个常量都有一个名称和一个对应的值,可以用于增强代码的可读性和可维护性。在Python中,枚举是由enum模块提供的
二、导入enum模块
import enum
三、常见枚举类
1.enum.Enum:基本的枚举类。
import enum
color1 = enum.Enum('Color', 'RED GREEN BLUE', start=2) # 声明color枚举,值从2开始递增
print('===================================')
print(color1.RED.value, color1.GREEN.value)
color2 = enum.Enum('Color', [('RED', 'RED'), ('GREEN', 'GREEN'), ('BLUE', 'BLUE')]) # 声明color枚举,并设置值
print('===================================')
print(color2.RED.value, color2.GREEN.value)
class Color3(enum.Enum): # 通过class创建枚举
RED = 'RED'
GREEN = 1
print('===================================')
print(list(Color3)) # 枚举转数组
print(Color3.__members__) # 返回成员对象
print(Color3.RED.value, Color3.GREEN.value) # 获取枚举值
2.enum.IntEnum:基于整数的枚举类,与enum.Enum不同的是字符串类型的值也会转为int,无法转int时会报错
import enum
class Color3(enum.IntEnum): # 通过class创建枚举
# RED = 'RED' #该代码会报错,因为RED无法转int
RED = '0'
GREEN = 1
print(type(Color3.RED.value)) # 虽然RED赋值的是字符串0,但是获取到的类似是int
3.enum.StrEnum:基于字符串的枚举类,与enum.IntEnum不同是不会自动转字符串
import enum
class Color3(enum.StrEnum): # 通过class创建枚举
# RED = 0 #该代码会报错,因为RED无法转int
RED = '0'
GREEN = '1'
print(type(Color3.GREEN.value))
4.enum.Flag:用于定义位标志的枚举类,允许使用位运算符对多个枚举成员进行组合
import enum
class Permissions(enum.IntEnum):
READ = '1'
WRITE = 2
EXECUTE = 3
# 组合多个权限
user_permissions = Permissions.READ | Permissions.WRITE
print(user_permissions) # 输出: Permissions.READ|WRITE
# 检查权限
if user_permissions & Permissions.READ:
print("用户有读取权限")
if user_permissions & Permissions.WRITE:
print("用户有写入权限")
if user_permissions & Permissions.EXECUTE:
print("用户有执行权限")
else:
print("用户没有执行权限")
5.enum.IntFlag:基于整数的位标志枚举类。
from enum import IntFlag
class Permissions(IntFlag):
# READ = 'READ' #此代码会报错
READ = '1'
WRITE = 2
EXECUTE = 4
# 组合标志成员
permissions = Permissions.READ | Permissions.WRITE
print(permissions)
# 检查标志是否存在
print(permissions & Permissions.READ) # 输出: 1
print(permissions & Permissions.EXECUTE) # 输出: 0
# 检查多个标志是否同时存在
print(permissions & (Permissions.READ | Permissions.WRITE)) # 输出: 3
print(permissions & (Permissions.READ | Permissions.EXECUTE)) # 输出: 1
四、常见方法、装饰器
1.enum.auto(value):返回一个自动的枚举常量,自动增加
import enum
class Color(enum.Enum):
RED = enum.auto(2) # 从2开始递增,默认1
GREEN = enum.auto()
YELLOW = enum.auto()
print(Color.RED.value, Color.GREEN.value, Color.YELLOW.value) # 2、3、4
2.enum.property:装饰器,用于定义枚举成员的属性
import enum
class Color(enum.Enum):
RED = enum.auto()
GREEN = enum.auto()
YELLOW = enum.auto()
@enum.property
def value(self):
if self == Color.RED:
return 'RED'
elif self == Color.GREEN:
return 'GREEN'
elif self == Color.YELLOW:
return 'YELLOW'
print(Color.RED.value, Color.GREEN.value, Color.YELLOW.value) # RED、GREEN、YELLOW
3.enum.nonmember(value):创建枚举类时保护某个值不成为枚举成员
import enum
class Color(enum.Enum):
RED = 1
GREEN = enum.nonmember('str')
YELLOW = 3
print(Color.RED.value) # 1
print(Color.YELLOW.value) # 3
# print(Color.GREEN.value) #报错
print(Color.GREEN) # str
print(Color.__members__) # 成员中无GREEN
4.enum.member(value):创建枚举类时强制将某个值作为枚举成员
import enum
class Color(enum.Enum):
RED = 1
GREEN = enum.member(2)
YELLOW = 3
print(Color.RED.value) # 1
print(Color.YELLOW.value) # 3
print(Color.GREEN) # 2
5.enum.unique:装饰器,确保枚举类的成员值是唯一的
from enum import Enum, unique
@unique
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# BLACK = 3 # 报错,3已存在
# 访问枚举成员的值
print(Color.RED.value) # 1
print(Color.GREEN.value) # 2
print(Color.BLUE.value) # 3
6.enum.global_str(member):获取成员name
from enum import Enum, global_str
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 访问枚举成员的值
print(global_str(Color.RED)) # RED
print(Color.GREEN.value) # 2
print(Color.BLUE.value) # 3
7.enum.global_enum:装饰器,使其引用所属模块而不是所属类,并将所有成员导出
from enum import Enum, global_enum
# 定义枚举类
@global_enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(RED) # 显示RED
print(Color.RED) # 显示RED