news 2026/8/23 23:37:34

探秘 Python 枚举类型:从基础到实战的深度指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
探秘 Python 枚举类型:从基础到实战的深度指南

探秘 枚举类型:从基础到实战的深度指南

深入介绍本文涵盖Enum、Flag等多种枚举类型的枚举种类, 从基本概念开始介绍, 再介绍创建方式, 接着介绍成员访问, 然后介绍比较运算等方面作出全面详细解析, 结合丰富示例与直观图表, 助力读者全面掌握枚举知识, 提升代码的可读性与可维护性。

枚举基础概念

有这么一种东西, 它叫枚举(Enum), 它是一组符号名称, 这些符号名称绑定到唯一值, 它的用途是表示有限个可选值的集合。它在功能方面和全局变量类似, 不过它有着更好的 repr()输出, 有着分组特性, 还有类型安全性。

于实际的编程情形里, 当某特定变量的取值范畴固定且具备有限性时, 枚举便发挥作用了。像用来展现一周之中的每一天, 又或是RGB颜色模型之中的基础颜色等这类场景。

枚举的创建与基本使用

进行枚举创建这件事是比较简单的, 也就是去定义一个类, 此类是继承自Enum的,就可以达成目的。对于成员名而言, 建议采取大写的形式, 目的在于表明这是常量。

from enum import Enum class Weekday(Enum): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 3 THURSDAY = 4 FRIDAY = 5 SATURDAY = 6 SUNDAY = 7 class Color(Enum): RED = 1 GREEN = 2 BLUE = 3

枚举成员具备某些有用的属性, 其中name属性会返回成员呈现的名称, 而value属性则会返回与其对应的所具的值。

# 通过值访问 print(Weekday(3)) # 通过名称访问 print(Color['RED'])

进行枚举的成员的repr(), 会将枚举名称、成员名称以及值显示出来, str()呢, 仅仅会把枚举名称和成员名称显示出来。

枚举的扩展与行为添加

枚举类能够增添方法, 举例来说, 给枚举增添一个能够从date对象把相匹配的枚举成员找出来的方法:

from datetime import date class Weekday(Enum): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 3 THURSDAY = 4 FRIDAY = 5 SATURDAY = 6 SUNDAY = 7 @classmethod def from_date(cls, date): return cls(date.isoweekday()) print(Weekday.from_date(date.today()))

Flag枚举

Flag枚举被用于表示那种能够包含多个值的情形, 它是继承自己Flag类的, 并且其成员值一般来讲是2的幂。

from enum import Flag class Weekday(Flag): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 4 THURSDAY = 8 FRIDAY = 16 SATURDAY = 32 SUNDAY = 64 # 单个选择 first_week_day = Weekday.MONDAY # 多个成员合并 weekend = Weekday.SATURDAY | Weekday.SUNDAY

Flag枚举可以进行迭代,方便处理多个值的情况 。

自动设定枚举值

若具体的枚举值所处特定情形下并非重点关注对象, 那么能够运用auto()这种方式, 去凭借自动的机制来进行值的安置。

from enum import Enum, auto class Color(Enum): RED = auto() BLUE = auto() GREEN = auto() print([member.value for member in Color])

枚举成员的比较运算

依照 ID 开展比较的是枚举成员,不具有对有序比较的支持。基于成员自身来作判断进而实施相等性比较。

比较操作示例结果

同一性比较

Color.RED is Color.RED

True

同一性比较

Color.RED is Color.BLUE

False

相等性比较

Color.BLUE == Color.RED

False

相等性比较

Color.BLUE == Color.BLUE

True

与非枚举值比较

Color.BLUE == 2

False

其他特性有重复成员与别名, 在枚举里, 成员名不能重复, 然而一个值能够有多个名称, 这些名称彼此是互为别名的。要确保值唯一, 运用()装饰器能够确保枚举值唯一, 防止重复值出现。迭代枚举成员时, 直接迭代不会列出别名, 需用属性来获取包含别名的所有成员的信息。合法成员与属性方面, 枚举类可以包含普通方法与特殊方法, 不过名称以单下划线开头而且结尾的是保留相关内容的, 特殊方法以及描述符不会成为枚举成员。受限的子类化: 一般来说,定义了成员的枚举类不太能够被子类化, 然而, 那些未定义成员的枚举类是可以被子类化的。数据类支持: 在继承的时候, ()会呈现出特殊的表现情况, 借助repr=False这个参数能够使用标准的repr()。打包与解包: 枚举类型能够被打包以及解包, 不过存在一定的限制条件, 像必须要在模块的最高层级进行定义, 还能够通过定义()去变更打包的方式。函数式 API: Enum类给出函数式 API, 通过调用能够创建枚举, 需要留意模块名以及的设置。派生枚举, 它属于Enum的变种, 并且还是int的子类, 其所含成员能够和整数开展比较。重点知识点予以扩展, 枚举在状态机里的应用(一)

用来管理对象于不同状态下行为的, 一种常用设计模式是状态机, 枚举在状态机里颇为有用, 能够清晰界定各种状态, 比如, 存在一个简单的网络连接状态机:

from enum import Enum class NetworkStatus(Enum): DISCONNECTED = 1 CONNECTING = 2 CONNECTED = 3 DISCONNECTING = 4 class NetworkConnection: def __init__(self): self.status = NetworkStatus.DISCONNECTED def connect(self): if self.status == NetworkStatus.DISCONNECTED: self.status = NetworkStatus.CONNECTING # 模拟连接操作 self.status = NetworkStatus.CONNECTED else: print(f"当前状态为 {self.status.name},无法连接") def disconnect(self): if self.status == NetworkStatus.CONNECTED: self.status = NetworkStatus.DISCONNECTING # 模拟断开操作 self.status = NetworkStatus.DISCONNECTED else: print(f"当前状态为 {self.status.name},无法断开") conn = NetworkConnection() conn.connect() conn.disconnect()

(二)结合枚举与数据库操作

于数据库开展操作期间, 枚举得以专门用来展现数据库的各个表内部的某些个字段所具备的取值范畴, 举例而言, 有一个用户角色表, 其角色类型是限定于数量有限的几种情况:

from enum import Enum import sqlite3 class UserRole(Enum): ADMIN = 1 USER = 2 GUEST = 3 # 创建数据库表 conn = sqlite3.connect('example.db') cursor = conn.cursor() cursor.execute('''CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, role INTEGER)''') # 插入数据 user1 = ('Alice', UserRole.ADMIN.value) cursor.execute("INSERT INTO users (name, role) VALUES (?,?)", user1) # 查询数据 cursor.execute("SELECT * FROM users WHERE role =?", (UserRole.ADMIN.value,)) result = cursor.fetchone() print(result) conn.commit() conn.close()

(三)在配置文件解析中的使用

当对配置文件做解析操作的时候, 枚举能够起到协助作用, 以此来保证配置项所具有的值是符合规定的, 是合理的。就像举例来说, 在一个用于游戏的配置文件里, 关于图形质量那是存在着几种预先设定好的选项的:

from enum import Enum class GraphicsQuality(Enum): LOW = 1 MEDIUM = 2 HIGH = 3 # 模拟读取配置文件 config = { 'graphics_quality': 'HIGH' } # 解析配置 quality = GraphicsQuality[config['graphics_quality']] print(f"当前图形质量设置为: {quality.name}")

总结

具有枚举类型, 这为开发者给予了一种强大且便利的方法, 用以处理存在有限个可选值的场景, 借助使用枚举, 可让代码更为清晰、易于阅读, 还能增强类型安全性, 从基础的枚举创建、对成员的访问, 到复杂的扩展、比较运算以及在各类实际场景里的应用, 枚举均展现出了它独特的优势。掌握枚举的运用方式, 能够提高代码的质量以及可维护性, 使开发进程更加高效。

TAG: 、枚举、Enum、Flag、

官方所给出的文档, 其名为官方文档 - Enum 指南, 它给出了超级权威超详细的知识点方面的说明, 这可是深入下去进行学习时极为重要的参考。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 23:36:30

【AI大模型进阶】写一个“法律条文检索助手”,体验RAG实战威力

【AI大模型进阶】写一个“法律条文检索助手”,体验RAG实战威力 这是【AI大模型进阶】系列第一百零一课,也是RAG全栈技术的落地实战标杆课。 在前一百节课程中,我们系统掌握了RAG核心原理、文档切片、向量检索、元数据过滤、多轮上下文检索、量化评估体系,完成了从理论到工…

作者头像 李华
网站建设 2026/8/23 23:33:53

拓扑排序详解(Topological Sort)

拓扑排序详解(Topological Sort)拓扑排序是对有向无环图(DAG) 的顶点进行线性排序,使得对于每条有向边 u → v,顶点 u 在排序中都出现在 v 之前。一、Kahn 算法(BFS 版本) 算法核心 …

作者头像 李华
网站建设 2026/8/23 23:29:20

无锡芯健细胞:免疫细胞存储适配人群全解析

无锡芯健细胞:免疫细胞存储适配人群全解析免疫细胞存储的核心价值并非大众认知的「未来保险」,真正决定适配性的是健康管理底层需求。——这是无锡芯健细胞深耕细胞生物技术5年,基于数千例存储案例与健康管理实战经验得出的结论。一、拆解本质…

作者头像 李华
网站建设 2026/8/23 23:27:33

雨晨 Windows 11 IoT 企业版 26H1 轻装 28120.2760

文件: 雨晨 Windows 11 IoT 企业版 26H1 轻装 28120.2760.wim 大小: 3953936566 字节 修改时间: 2026年8月22日, 星期六, 08:11:00 MD5: C098DFA89EA18F9759B8BB40543DD83D SHA1: DDD8389C29717AD458B43C9E71ECFCD685D3CEAC CRC32: 6843B70Ehttps://1811716252.share.123pan.cn…

作者头像 李华
网站建设 2026/8/23 23:26:38

工信部三级智能制造评审通关背后:一天,一个项目组,一家灯饰厂

中山市明某智能照明迎来工信部智能制造三级现场评审。精工智能项目团队全天驻场,用半天时间跑完从车间设备联调到跨部门流程拉通的全流程彩排,下午完成迎审布置与现场答辩支撑。本文记录了一次评审攻坚的真实过程——智能制造能力成熟度评估,…

作者头像 李华