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

news/2025/9/24 18:13:59/文章来源:https://www.cnblogs.com/Zzbj/p/19096278

一、介绍

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 = 1GREEN = 2BLUE = 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 Enumclass Color(Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class 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 Enumclass Color(int, Enum):"""颜色枚举类示例"""RED = 1GREEN = 2BLUE = 3class 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 获取值,Trueprint(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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员的旅行神器:用AI提示词工程解决选择困难症

作为程序员,我们习惯了用技术解决工作中的复杂问题,但面对旅行规划时却常常陷入选择困难。今天分享一个实用的AI工具——专业的旅行目的地推荐提示词,让我们把解决问题的技术思维应用到生活中。作为程序员,我们习惯…

修改人大金仓V8数据库时间

sed -i "s#^timezone.*#timezone = Asia/Shanghai#" /home/kingbase/userdata/data/kingbase.conf控红色部分替换为数据库配置文件位置,在数据库中执行 SHOW config_file; 可查看位置路径然后执行 sed …

BUUCTF-babyheap_0ctf_2017题解(含详细过程与思路分析)

BUUCTF-babyheap_0ctf_2017题解(含详细过程与思路分析)一、题目来源 BUUCTF-Pwn-babyheap_0ctf_2017二、信息搜集 将题目给的可执行文件丢入Linux虚拟机中 通过file命令查看文件类型:通过checksec命令查看本题采用的…

洛阳制作网站的公司哪家好16岁做分期网站

力扣题目链接 编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 . 表示。 解题思路 …

自己电脑做网站教程制作京东网站建设

技术框架 框架作用 前端 React构建用户界面的 JavaScript 库ReduxJavaScript 应用的状态管理库,管理组件间的状态共享Webpack前端资源打包工具BabelJavaScript 编译器D3.js数据可视化的 JavaScript 库后端 Flask轻量级的 Python web 框架,处理 HTTP 请求、路由以及其他 Web 服…

做的很好的画册网站运维工程师主要做什么

CSS样式如何在页面中使用,包含三种方式:行内样式、内嵌式样式表、链接式样式表。 1、行内样式 行内样式是比较直接的一种样式,直接定义在 HTML 标签之内,并通过 style 属性来实现。这种方式比较容易学习,但是灵活性不…

油猴(Tampermonkey)插件从安装到使用

一、安装油猴插件 首先,打开chrome浏览器-设置-扩展程序,然后打开谷歌商店,搜索油猴插件,安装到浏览器上。接着,回到拓展程序-我的拓展程序页面,就可以看到我们刚才安装好的油猴插件了! 最后,启动插件,将浏览…

【EF Core】框架底层的数据库连接管理

在开始水文章前,老周补充说明一下,在前一篇水文中,老周扯了跟 Owned 关系相关的一些话题,这里补充一句:Owned 关系是不存在“多对多”的,如果 A 实体 Own B 实体,那么,A 对 B 是完全占有,B只属于A,数据不共享…

iNeuOS工业互联网操作系统,更新计量数据处理方式和在线报表,实现能源管理基础功能

本次iNeuOS工业互联网操作系统升级内容主要包括:对计量数据点的处理方式和在线报表增加时间格式化配置。主要应用场景针对能源管理的在线监测、数据处理和在线(日、月、年)报表的整体应用,完成能源管理系统的基础应…

React 展示Markdown内容 - 教程

React 展示Markdown内容 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

江门网站推广哪家好长沙建网

使用Benchmark.NET对C# 代码进行基准测试的简介在我以前的文章中[10],我介绍了该系列文章[11],在其中我将分享我的经验,同时了解C#和.NET Core(corefx)框架的新性能。在本文中,我想着重于对现有…

西电PCB设计指南第4章学习笔记

西电PCB设计指南第4章学习笔记 四、电源路径分析电源路径的基本原理回路路径与感抗 感抗与路径有关,信号线看似很短很直,但是引入了较大的环路感抗。多路信号线的环路之间的互感,造成相互干扰 所以,我们不能但按照…

图像处理去除噪点验证码的识别逻辑实践

验证码设计中常见的防护手段之一就是加入随机噪点,让字符边缘不清晰,从而干扰自动识别。本文介绍一种基于图像滤波与形态学操作的处理流程,帮助提取出清晰的字符区域。 一、问题分析 噪点验证码的典型特征是: 图像…

读取zip包中的文件

private List<String> readFile(String zipFilePath,String fileName){File file = new File(zipFilePath);List<String> list;System.out.println(file.getName());//20250709-5427327003468403533.ziptr…

网站开发合同知识产权手机在线制作图片加字

来源&#xff1a;图灵人工智能作者&#xff1a;王健宗等https://wwwihcm/people/euu-lin-jun-7原文链接&#xff1a;https://kns.cnki.net/kcms/detail/31.1289.tp.20201123.1641.002.html摘要&#xff1a;随着计算机行业和互联网时代的不断发展与进步&#xff0c;图神经网络已…

网站营销的优缺点网站视觉

2010/2/8号 星期一 1.决定记录下每天学到的东西和感悟 2.看老赵的博客&#xff0c;学到一句话&#xff1a;Apple告诉我们的铁律是&#xff1a;表面功夫一定要做足。 3.看到一个笑话&#xff1a;你属什么&#xff1f;我属 于你。 2010/2/9号 星期二 1.减少页面中独立的请求数&…

轻松建站网站建设图片如何加载

本文将综合运用 C++11 中的新的基础设施(主要是多线程、锁、条件变量)来阐述一个经典问题——生产者消费者模型,并给出完整的解决方案。 生产者消费者问题是多线程并发中一个非常经典的问题,相信学过操作系统课程的同学都清楚这个问题的根源。本文将就四种情况分析并介绍生产…

Java文件上传和其他参数一起提交的案例

Java文件上传和其他参数一起提交的案例package cn.daenx.demo.controller;import cn.daenx.demo.Aoidj; import cn.hutool.core.util.ObjectUtil; import org.springframework.web.bind.annotation.*; import org.spri…

Attention复杂度解析与改进方向

Attention复杂度解析与改进方向Attention复杂度解析与改进方向 摘要/引言 在大规模语言模型(LLM)浪潮中,扩展模型上下文窗口长度被认为是提升模型能力和应用范围的关键方向。然而,现代Transformer结构中的自注意力…

实用指南:Qt的数据库模块介绍,Qt访问SQLite详细示例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …