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

探秘 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 指南, 它给出了超级权威超详细的知识点方面的说明, 这可是深入下去进行学习时极为重要的参考。

http://www.cnnetsun.cn/news/4179884.html

相关文章:

  • Cursor版GitHub上线后再升级,/goal转正、子Agent独立,重塑软件工程生产线!
  • 【AI大模型进阶】写一个“法律条文检索助手”,体验RAG实战威力
  • 拓扑排序详解(Topological Sort)
  • 无锡芯健细胞:免疫细胞存储适配人群全解析
  • 雨晨 Windows 11 IoT 企业版 26H1 轻装 28120.2760
  • 工信部三级智能制造评审通关背后:一天,一个项目组,一家灯饰厂
  • 德系车维修质保体系的技术支撑分析:从配件追溯到施工标准化
  • python的运筹学工业场景模拟第九十二篇:金属型材下料,多种型材原料,多规格零件,整数规划,最小原料消耗,统计边角料。
  • 大厂Java面试实录:从Java SE到微服务,电商场景下的技术拷问与谢飞机翻车合集
  • 科颜氏白泥同源配方OEM代工厂揭秘:比价输在起跑线的老板,都忽略了泥膜料体的这三道隐形门槛
  • 福意联血液运输冷藏箱的优势特点详解
  • 关于“真理硬度”与KTS体系绝对自明性的系统性陈述
  • 让大模型思考,让小模型执行:在 Elastic Workflows 中拆分 LLM 成本
  • 技术面试黄金技巧:从STAR法则到薪资谈判
  • Java面试:从八股文到实战的演变与准备策略
  • Ceres损失函数选型指南:从原理到实战的鲁棒优化策略
  • 齿轮参数化设计:从建模到校核的工程实践指南
  • CANdelaStudio入门指南:从零创建汽车诊断数据库
  • Gradle配置全解析:从核心文件到性能优化与实战避坑指南
  • VSCode调试中No such file or directory错误:彻底解决相对路径与工作目录问题
  • Python类型注解与typing模块实战指南:从基础到工程化应用
  • Linux系统安装Qt5:三种方法详解与配置实战指南
  • IntelliJ IDEA自定义背景全攻略:用Background Image Plus插件打造高效护眼开发环境
  • 电商支付与结算系统架构实战:从网关设计到微服务中台演进
  • CSMA/CD协议详解:从碰撞检测到以太网演进
  • MAT内存泄漏分析实战:从堆转储到根因定位
  • 大数据与嵌入式开发:技术路径、就业前景与学习路线深度对比
  • FreeSWITCH GPU硬件编码性能测试与优化实战指南
  • C++国际象棋程序:Qt界面+TCP网络+规则引擎三层解耦实战
  • 小宇宙竞品分析:从播客社区设计看垂直产品破局之道