Python标准库enum模块实现枚举类

一、介绍

Python标准库中的enum模块提供了一种创建枚举类型的方式,枚举类型是一种特殊的类,用于定义一组命名的常量。以下是enum模块的主要特点和实现方式:

  1. 基本用法‌:

    • 使用Enum类可以定义一个枚举类型,枚举成员是类的属性,每个成员有唯一的名称和值。
    • 枚举成员的值可以是任意类型,但通常是整数或字符串。
  2. 枚举成员‌:

    • 枚举成员是唯一的,不能重复定义。
    • 可以通过名称或值访问枚举成员。
  3. 自动赋值‌:

    • 使用auto()函数可以自动为枚举成员分配值(通常是递增的整数)。
  4. 功能扩展‌:

    • IntEnum:枚举成员的值必须是整数,并且可以与整数直接比较。
    • FlagIntFlag:支持按位运算的枚举类型,适用于标志位操作。
  5. 迭代和比较‌:

    • 枚举类型是可迭代的,可以遍历所有成员。
    • 枚举成员支持身份比较(is)和相等比较(==),但不支持大小比较(除非使用IntEnum)。
  6. 别名和唯一性‌:

    • 可以定义别名(多个名称对应同一个值),但默认情况下不允许重复值(除非使用@unique装饰器禁用别名)。
from enum import Enum, auto, unique


@unique
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
    # YELLOW = 1  # 会报错,因为值重复且使用了@unique装饰器


class Status(Enum):
    PENDING = auto()
    RUNNING = auto()
    COMPLETED = auto()


# 访问枚举成员
print(Color.RED)  # 输出: Color.RED
print(Color.RED.name)  # 输出: RED
print(Color.RED.value)  # 输出: 1

# 遍历枚举
for status in Status:
    print(status)
"""
Status.PENDING
Status.RUNNING
Status.COMPLETED
"""

enum模块的枚举类提供了清晰、安全的方式管理常量,避免了魔法数字和字符串的使用,提高了代码的可读性和可维护性。

 

二、多重继承int、str

1、单继承Enum

特点:

  • 类型安全‌:枚举成员是独立的枚举对象,不与整数、字符串等混用。
  • 禁止整数、字符串的操作‌:Color.RED + 1会报错(不支持运算)。
  • 严格比较‌:Color.RED == 1 返回 False(需显式比较.value)。

适用场景‌:需要强类型约束,避免枚举值与数字、字符串混淆时。

from enum import Enum


class Color(Enum):
    """颜色枚举类示例"""
    RED = 1
    GREEN = 2
    BLUE = 3


class Status(Enum):
    """状态枚举类示例"""
    PENDING = 'pending'
    RUNNING = 'running'
    COMPLETED = 'completed'


"""
枚举成员是独立的枚举对象,不与整数、字符串混用。
需要使用时,要通过 value 获取实际的值才能进行使用
"""
print(Color.RED == 1)  # False
print(Color.RED.value == 1)  # 需要通过 value 获取实际的值,True
print(Status.RUNNING == 'running')  # False
print(Status.RUNNING.value == 'running')  # 需要通过 value 获取实际的值,True

2、int、str和Enum多重继承

特点:

  • 整数兼容‌:枚举成员可当整数、字符串使用(Color.RED + 1 输出 2)。
  • 隐式比较‌:Color.RED == 1 返回 True
  • 序列化友好‌:直接存储为整数、字符串(如JSON序列化)。

适用场景‌:需要与数字交互(如数据库状态码、协议字段)。

from enum import Enum


class Color(int, Enum):
    """颜色枚举类示例"""
    RED = 1
    GREEN = 2
    BLUE = 3


class Status(str, Enum):
    """状态枚举类示例"""
    PENDING = 'pending'
    RUNNING = 'running'
    COMPLETED = 'completed'


"""
有没有通过 value 取值都能正常使用
"""
print(Color.RED)  # 类型还是Color.RED,但是继承了 int,实际使用的时候是 int 类型,不需要通过 value 获取值
print(Color.RED == 1)  # 没有通过 value 但是继承了 int:True
print(Color.RED.value == 1)  # 通过 value 获取值,True

print(Status.RUNNING)  # 类型还是Status.RUNNING,但是继承了 str,实际使用的时候是 str 类型,不需要通过 value 获取值
print(Status.RUNNING == 'running')  # 没有通过 value 但是继承了 str:True
print(Status.RUNNING.value == 'running')  # 通过 value 获取值,True

关键区别总结

特性Enumint + Enum
成员类型 枚举对象 枚举对象 + 整数
数学运算支持 ❌ 报错 ✅ 支持
与整数直接比较 ❌ 需用.value ✅ 直接比较
序列化为数字 ❌ 需手动处理 ✅ 自动转为整数

根据需求选择:强类型用纯Enum,需数字兼容则加int

 

posted @ 2025-09-25 00:59  我用python写Bug  阅读(107)  评论(0)    收藏  举报