Python中枚举类型的详解
1. 枚举类型的定义和简单使用
在 Python 中,枚举类型可以通过使用 enum
模块来实现。下面是一个使用枚举类型的示例:
from enum import Enum
# 定义一个枚举类型
class ColorEnum(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 使用枚举类型
print(ColorEnum.RED) # 输出:ColorEnum.RED
print(ColorEnum.RED.name) # 输出:RED
print(ColorEnum.RED.value) # 输出:1
# 迭代枚举类型
for color in ColorEnum:
print(color)
# 输出:
# ColorEnum.RED
# ColorEnum.GREEN
# ColorEnum.BLUE
- 导入一个
Enum
类,并定义一个名为ColorEnum
的枚举类型,枚举类型中的每个成员都为类的属性,因此要访问枚举成员,需要通过.
运算符来访问。 - 通过
ColorEnum.RED
来访问枚举成员,并用.name
属性来获取成员的名称,使用.value
属性来获取成员的值。 - 使用
for
循环来迭代枚举类型中的所有成员 - 为什么
ColorEnum
类可以在for
循环上遍历呢?
这是因为ColorEnum
类继承了Enum
类,而Enum
类内部实现了__iter__
方法,使得ColorEnum
的类属性可以通过for
循环来迭代枚举类型中的所有成员。
2. 枚举类型的实际使用(使用枚举代替数字来进行分类)
如果在项目中需要通过不同的数字来判断不同的类别,那么可以通过使用枚举类型来表示这些数字,这时就可以将数字转换为相应的枚举成员来处理。
例如一个网站有 邮箱、手机、微信小程序、微信公众号 这几种注册方式,用户注册时,用户请求传递过来数字,在后端处理的时候,总不能直接使用 100、101 这样的数字来区分不同的注册方式吧?这个时候枚举就起到了作用,我们将使用枚举类型来表示这些数字。
from enum import Enum
# 定义一个枚举类型
class ClientTypeEnum(Enum):
USER_EMAIL = 100 # 邮箱
USER_MOBILE = 101 # 手机
USER_MINA = 200 # 微信小程序
USER_WX = 201 # 微信公众号
print(ClientTypeEnum(100))
print(ClientTypeEnum(101))
try:
print(ClientTypeEnum(400))
except ValueError as e:
print(f"ValueError: {e}")
# raise e
pass
# 结果:
# ClientTypeEnum.USER_EMAIL
# ClientTypeEnum.USER_MOBILE
# ValueError: 400 is not a valid ClientTypeEnum
根据不同的注册方式,匹配不同的处理函数:
from enum import Enum
# 定义一个枚举类型
class ClientTypeEnum(Enum):
USER_EMAIL = 100 # 邮箱
USER_MOBILE = 101 # 手机号
USER_MINA = 200 # 微信小程序
USER_WX = 201 # 微信公众号
# 验证输入的类型
def validate_type(value):
try:
client = ClientTypeEnum(value)
return client
except ValueError as e:
raise e
# 根据匹配的值进行相应的函数处理
def handle_client_register(client):
# 匹配方式一
# promise = {
# ClientTypeEnum.USER_EMAIL: __register_user_by_email
# }
# 匹配方式二
match client:
case ClientTypeEnum.USER_EMAIL:
# __register_user_by_email
print("通过邮箱注册")
case ClientTypeEnum.USER_MOBILE:
print("通过手机号注册")
case ClientTypeEnum.USER_MINA:
print("通过微信小程序注册")
case ClientTypeEnum.USER_WX:
print("通过微信注册")
case _:
print("未匹配到任何模式")
request_value = 100 # 用户注册时传过来的值
client = validate_type(request_value) # 验证注册类型以及转换为枚举
handle_client_register(client) # 匹配对应的枚举项,执行不同的处理函数
# 结果:
# 通过邮箱注册