当前位置: 首页 > news >正文

python中的枚举类

一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。

针对这种特殊的类,Python 3.4 中新增加了 Enum 枚举类。也就是说,对于这些实例化对象个数固定的类,可以用枚举类来定义。

例如,下面程序演示了如何定义一个枚举类:

  1. from enum import Enum
  2. class Color(Enum):
  3. # 为序列值指定value值
  4. red = 1
  5. green = 2
  6. blue = 3

如果想将一个类定义为枚举类,只需要令其继承自 enum 模块中的 Enum 类即可。例如在上面程序中,Color 类继承自 Enum 类,则证明这是一个枚举类。

在 Color 枚举类中,red、green、blue 都是该类的成员(可以理解为是类变量)。注意,枚举类的每个成员都由 2 部分组成,分别为 name 和 value,其中 name 属性值为该枚举值的变量名(如 red),value 代表该枚举值的序号(序号通常从 1 开始)。

和普通类的用法不同,枚举类不能用来实例化对象,但这并不妨碍我们访问枚举类中的成员。访问枚举类成员的方式有多种,例如以 Color 枚举类为例,在其基础上添加如下代码:

  1. #调用枚举成员的 3 种方式
  2. print(Color.red)
  3. print(Color['red'])
  4. print(Color(1))
  5. #调取枚举成员中的 value 和 name
  6. print(Color.red.value)
  7. print(Color.red.name)
  8. #遍历枚举类中所有成员的 2 种方式
  9. for color in Color:
  10. print(color)

程序输出结果为:

Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue


枚举类成员之间不能比较大小,但可以用 == 或者 is 进行比较是否相等,例如:

  1. print(Color.red == Color.green)
  2. print(Color.red.name is Color.green.name)

输出结果为:

Flase
Flase


需要注意的是,枚举类中各个成员的值,不能在类的外部做任何修改,也就是说,下面语法的做法是错误的:

  1. Color.red = 4


除此之外,该枚举类还提供了一个 __members__ 属性,该属性是一个包含枚举类中所有成员的字典,通过遍历该属性,也可以访问枚举类中的各个成员。例如:

  1. for name,member in Color.__members__.items():
  2. print(name,"->",member)

输出结果为:

red -> Color.red
green -> Color.green
blue -> Color.blue


值得一提的是,Python 枚举类中各个成员必须保证name 互不相同,但 value 可以相同,举个例子:

  1. from enum import Enum
  2. class Color(Enum):
  3. # 为序列值指定value值
  4. red = 1
  5. green = 1
  6. blue = 3
  7. print(Color['green'])

输出结果为:

Color.red

可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python 允许这种情况的发生,它会将green 当做是 red 的别名,因此当访问 green 成员时,最终输出的是 red。

在实际编程过程中,如果想避免发生这种情况,可以借助 @unique 装饰器,这样当枚举类中出现相同值的成员时,程序会报 ValueError 错误。例如:

  1. #引入 unique
  2. from enum import Enum,unique
  3. #添加 unique 装饰器
  4. @unique
  5. class Color(Enum):
  6. # 为序列值指定value值
  7. red = 1
  8. green = 1
  9. blue = 3
  10. print(Color['green'])

运行程序会报错:

Traceback (most recent call last):
File "D:\python3.6\demo.py", line 3, in <module>
class Color(Enum):
File "D:\python3.6\lib\enum.py", line 834, in unique
(enumeration, alias_details))
ValueError: duplicate values found in <enum 'Color'>: green -> red


除了通过继承 Enum 类的方法创建枚举类,还可以使用 Enum() 函数创建枚举类。例如:

  1. from enum import Enum
  2. #创建一个枚举类
  3. Color = Enum("Color",('red','green','blue'))
  4. #调用枚举成员的 3 种方式
  5. print(Color.red)
  6. print(Color['red'])
  7. print(Color(1))
  8. #调取枚举成员中的 value 和 name
  9. print(Color.red.value)
  10. print(Color.red.name)
  11. #遍历枚举类中所有成员的 2 种方式
  12. for color in Color:
  13. print(color)

Enum() 函数可接受 2 个参数,第一个用于指定枚举类的类名,第二个参数用于指定枚举类中的多个成员。

如上所示,仅通过一行代码,即创建了一个和前面的 Color 类相同的枚举类。运行程序,其输出结果为:

Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue

http://www.jsqmd.com/news/555681/

相关文章:

  • 5个步骤让jupyter-themes实现Jupyter主题定制:从视觉疲劳到高效编码的蜕变
  • 别再只记分号了!命令注入绕过全攻略:以BUUCTF ACTF2020 Exec题为例,详解amp;、|、||的实战用法
  • 手写RPC
  • 2026年羊绒衫厂家推荐:高端商务通勤羊绒衫靠谱厂家及用户口碑分析 - 十大品牌推荐
  • 智能工作流引擎:多智能体系统任务编排的高效解决方案
  • 计算机毕业设计springboot停车场管理系统设计与实现 基于SpringBoot的智慧停车服务平台设计与实现 智能停车场运营系统开发与优化
  • 【Python 教程】如何将 JSON 数据转换为 Excel 工作表
  • 干货测评|2026年靠谱一键生成论文工具榜单,高质初稿轻松写
  • 机器视觉如何赋予机器“三维双眼”——3D重建技术全景指南
  • RPCS3开源模拟器完全指南:让PS3游戏在PC重生的实用方案
  • GD32F407实战指南:GPIO模拟IIC驱动24C08 EEPROM数据持久化
  • 如何通过Agent-S实现智能化CI/CD流水线构建与优化
  • Phi-4-Reasoning-Vision部署教程:解决双卡算力分配不均的4个调试技巧
  • SQLiteGo:国产 ARM (aarch64) 银河麒麟 SQLite 数据库管理和数据分析工具分享
  • EmbeddingGemma-300m部署全攻略:从安装到应用场景解析
  • 终极指南:如何用MiniCPM-V 1.0构建高效轻量级多模态大模型应用
  • Vue前端集成lingbot-depth-pretrain-vitl-143D可视化组件
  • 深度剖析Mac Mouse Fix:开源鼠标驱动架构演进与性能优化实战
  • HsMod:炉石传说游戏增强框架完全部署指南
  • windows10 Qt5.15.14 msvc2019 编译部署
  • PyTorch 2.x实战:torch.compile如何让你的模型训练速度翻倍(附详细性能对比)
  • 前后端框架模式对比(golang)
  • ComfyUI工作流迁移实战指南:7个关键策略打造无缝创作体验
  • YOLOv12官版镜像5分钟快速部署:零基础搭建实时目标检测环境
  • 告别格式迷宫:3个让图片处理效率提升10倍的隐藏功能
  • SenseVoice-Small模型服务监控与日志收集实战
  • 飞牛NAS系统上玩转Docker版OpenWrt:从网卡名识别到完整旁路由搭建指南
  • 从协议栈到信号修复:一份给硬件工程师的UCIe实战避坑手册
  • 别再只会用示波器了!用STM32做一个便携式多功能频率计,测频/测周期/测占空比全搞定
  • 掌握AI专著生成技巧,借助优质工具,快速产出高质量专著