Python 枚举类型详解:从基础实现到 enum 标准库

Hazel
Hazel
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析 Python 中的枚举类型实现。从早期的字典、类及元组方案出发,分析其可变性与局限性,引出 Python 3.4 引入的 enum 标准库。详细讲解 Enum、IntEnum 的定义方式,unique 修饰器的去重机制,以及枚举成员的单例特性、不可变性与成员间访问方法,帮助开发者规范使用枚举。

枚举类型的基本概念

枚举类型本质上是一组标签或常量的集合,主要用于表示具有有限取值范围的特定集合,例如星期几、月份或系统状态等场景。

Python 中枚举的早期实现方案

Python 原生类型中并未内置专门的枚举类型,但开发者可以通过多种手段模拟实现,比如使用字典或自定义类:


MiracleLove = {'MON': '林志玲', 'TUS': '陈意涵', 'WEN': '张柏芝', 'THU': '辛芷蕾', 'FRI': '周冬雨'}

class MiracleLove:
  MON = '林志玲'
  TUS = '陈意涵'
  WEN = '张柏芝'
  THU = '辛芷蕾'
  FRI = '周冬雨'

上述两种方案可视为简易的枚举实现方式。

若此类枚举变量仅在局部作用域内使用,通常不会引发问题。

然而,这些实现方式均为可变对象(mutable),意味着它们可能在其他位置被意外修改,进而影响程序的正常运行:


MiracleLove['MON'] = MiracleLove['FRI']
print(MiracleLove)

通过类定义的枚举甚至允许实例化,导致其语义变得模糊不清:


ml = MiracleLove()
print(ml.MON)

MiracleLove.MON = 2
print(ml.MON)

虽然可以使用不可变类型(如元组)来替代,但这会背离枚举设计的初衷,使标签退化为无实际意义的普通变量:


MiracleLove = ('R', 'G', 'B')
print(MiracleLove[0], MiracleLove[1], MiracleLove[2])

Python 3.4 引入的 enum 标准库

为提供更完善的解决方案,Python 通过 PEP 435 在 3.4 版本中引入了 enum 标准库;对于 3.4 之前的版本,可通过执行 pip install enum 安装兼容的支持库。

enum 模块提供了 Enum、IntEnum 和 unique 三个核心工具,使用方式简洁直观。开发者可通过继承 Enum 或 IntEnum 来定义枚举类型,其中 IntEnum 强制要求枚举成员必须为整数类型(或可转换为整数),而 unique 修饰器则用于限制枚举成员的值不能重复:


from enum import Enum, IntEnum, unique

try:
  @unique
  class MiracleLove(Enum):
    MON = '林志玲'
    TUS = '陈意涵'
    WEN = '张柏芝'
    THU = '辛芷蕾'
    FRI = '周冬雨'
except ValueError as e:
  print(e)
  
# duplicate values found in <enum 'MiracleLove'>: FRI -> MON

try:
  class MiracleLove(IntEnum):
    MON = 1
    TUS = 2
    WEN = 3
    THU = 4
    FRI = '周冬雨'
except ValueError as e:
  print(e)

# invalid literal for int() with base 10: '周冬雨'

枚举成员的特性与使用

更具特色的是,Enum 的成员均为单例(Singleton),且不可实例化、不可修改:


class MiracleLove(Enum):
  MON = '林志玲'
  TUS = '陈意涵'
  WEN = '张柏芝'
  THU = '辛芷蕾'
  FRI = '周冬雨'

try:
  MiracleLove.MON = 2
except AttributeError as e:
  print(e)

# Cannot reassign members.

尽管枚举成员本身不可实例化,但可以将枚举成员赋值给普通变量:


mon = MiracleLove(0)
tus = MiracleLove(1)
wen = MiracleLove(2)
print(mon, tus, wen)

# MiracleLove.MON 
# MiracleLove.TUS 
# MiracleLove.WEN

同时支持进行相等性或同一性比较:


print(mon is MiracleLove.MON)
print(mon == MiracleLove.MON)
print(mon is tus)
print(wen != MiracleLove.TUS)
print(mon == 0) # 不等于任何非本枚举类的值

# True
# True
# False
# True
# False

最后,由于枚举成员本身也是枚举类型,因此可以通过一个成员访问其他成员:


print(mon.TUS)
print(mon.TUS.WEN.MON)

# MiracleLove.TUS
# MiracleLove.MON

但需谨慎使用这一特性,因为它可能与成员所在命名空间中的其他名称发生冲突:


print(mon.name, ':', mon.value)
class Attr(Enum):
  name = 'NAME'
  value = 'VALUE'

print(Attr.name.value, Attr.value.name)

# R : 0
# NAME value

总结:

enum 模块用法简单且功能明确,但其内部实现机制极具学习价值。若希望深入探索 Python 中关于 Class 和 Metaclass 的高级特性,阅读 enum 源码是一个很好的切入点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。