Python中枚举类型的详解

发布时间 2023-12-31 22:08:08作者: 夏夜星空晚风

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. 枚举类型的实际使用(使用枚举代替数字来进行分类)

如果在项目中需要通过不同的数字来判断不同的类别,那么可以通过使用枚举类型来表示这些数字,这时就可以将数字转换为相应的枚举成员来处理。

例如一个网站有 邮箱手机微信小程序微信公众号 这几种注册方式,用户注册时,用户请求传递过来数字,在后端处理的时候,总不能直接使用 100101 这样的数字来区分不同的注册方式吧?这个时候枚举就起到了作用,我们将使用枚举类型来表示这些数字。

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)              # 匹配对应的枚举项,执行不同的处理函数


# 结果:
# 通过邮箱注册