Python深入浅出分析enum枚举类
本文深入解析Python中enum枚举类的核心用法。通过对比传统大写变量定义方式,阐述使用Enum类定义常量的优势。详细演示枚举的创建、成员访问、__members__遍历及别名处理机制,并介绍如何利用unique装饰器强制键值唯一性,帮助开发者在工程实践中规范使用枚举类型。
枚举类Enum
在企业级开发场景中,枚举类的应用十分广泛。
若需定义一组常量,传统做法是使用大写字母配合整数值,例如表示月份:
# 当项目中需要使用12个月份时 JAN = 1 FEB = 2 ... NOV = 11 DEC = 12
然而,上述定义方式生成的类型是 int,且本质上仍是普通变量。在运算过程中,无法动态生成对应的枚举值,这种指代方式仅是为了更优雅地使用变量数值。
更优的方案是为此类枚举定义一个 class 类型,使每个常量成为该 class 的唯一实例。Python 提供了 Enum 类来实现这一功能。
优化后的代码如下:
# -*- coding: utf-8 -*-
from enum import Enum
# 枚举中,一个名字对应一个值
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Otc', 'Nov', 'Dec'))由此我们获得了 Month 类型的枚举类,可直接使用 Month.Jan 引用特定常量,或通过 for 循环遍历所有成员以获取值。
Month.__members__ 是 Month 类的内置属性,用于打印成员标签。
若调用 .items() 函数,可打印出所有成员,其返回数据类型为元组。
for name, member in Month.__members__.items():
print(f'{name} => {member} , {member.value}')+

接下来定义一个颜色常量枚举。
# -*- coding: utf-8 -*-
from enum import Enum
# 枚举中 一个一个名字对应一个值
Month = Enum('抬头-Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
print(Month.__members__) # 枚举中的值自动从1开始,不会重复
# 得到三月份的值
print(Month['Mar'].value) # 3
# 根据(2)来获得月份名字
print(Month(2).name) # Feb
# 定义一个颜色的常量枚举
class Color(Enum): # 第二种:自定义一个枚举类
red = 100
green = 200
blue = 300
yellow = 200 # 不允许key相同或者value,如果value重复,根据value取name只能取第一个
print(Color(200)) # Color.green注意,枚举中不允许 Key 相同或 Value 相同;若 Value 重复,通过 Value 获取 Name 时仅能取到第一个匹配的项。

总结
1. 枚举类不可用于实例化对象。
2. 访问枚举项时,直接使用类名后接项名即可,例如 color.RED。
3. 枚举类中定义的 Key = Value,在类外部无法修改 Value 值。
4. 枚举项支持比较操作,可使用 == 或 is 运算符。
5. 枚举类中的 Key 必须唯一,Value 可以重复;当 Value 相同时,各项 Key 均被视为彼此的别名。
6. 枚举类支持 for 循环遍历,members.items() 可遍历包含别名的所有类成员。
7. 若需确保 Key 和 Value 均不重复,需导入 unique 装饰器对枚举类进行修饰。
至此,关于 Python 深入浅出分析 enum 枚举类的介绍已完成。如需了解更多 Python 枚举类相关内容,请搜索本站过往文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













