python 枚举(enum)

1. 枚举模块 enum

python 的枚举是使用类来实现的,类属性是枚举名称,属性值对应枚举值。Enum 的使用有如下特点:
枚举类不允许定义相同枚举名称,但不同的枚举名称可以有相同的值,后者相当于前者的别名。
枚举值不能被修改,枚举值一旦被修改,就会引发 AttributeError 异常。
两个不同的枚举类,枚举名称和枚举值即便相同,在比较时也是不相等的。
枚举类的一个枚举有 name(标签)和 value(枚举值)两个属性,使用枚举值时,务必通过 value 获取枚举值。

2. 枚举使用实例

python3 提供了 enum 模块,定义类时继承 enum.Enum,可以创建一个枚举类型数据,除此以外还可以继承 enum.IntEnum,枚举值只能是int。

import enumclass ColorCode(enum.Enum):RED = 1BLUE = 2BLACK = 3def print_color(color_code):if color_code == ColorCode.RED.value:print('红色')elif color_code == ColorCode.BLUE.value:print('蓝色')elif color_code == ColorCode.BLACK.value:print('黑色')print_color(1)

枚举值不能被修改,是使用枚举类型进行编程的最重要的目的之一,假设枚举值可以被修改,那么也就没有必要提供 enum 这个模块了,我们使用自定义类和类属性就能够替代 enum 模块。
如果执行:

ColorCode.RED = 4

将会引发错误

raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.

3. 枚举值

3.1. 枚举值唯一

枚举值理论上是允许重复的,如果不希望出现枚举值重复的情况,可以使用 enum 模块提供的 unique 装饰器

import enum
from enum import unique@unique
class ColorCode(enum.Enum):RED = 1BLUE = 1BLACK = 3

如果枚举值出现了重复的情况,由于有 unique 装饰器修饰,在执行时会报错。

3.2. 枚举值遍历

使用 for 循环可以对枚举值进行遍历,枚举有 name 和 value 两个属性,name 就是枚举类的类属性,value 则是类属性的值。

import enum
from enum import unique@unique
class ColorCode(enum.Enum):RED = 1BLUE = 2BLACK = 3for color in ColorCode:print(color.name, color.value)

程序输出结果:

RED 1
BLUE 2
BLACK 3

3.3. 枚举值比较

两个枚举值之间只支持身份运算符 is 和比较运算符 == 进行比较。

print(ColorCode.RED == ColorCode.RED)       # True

这看起来没有什么特别,但如果使用枚举和对应的值进行比较,就会产生一些出乎意料的结果

print(ColorCode.RED == 1)       			# False

这是非常容易出错的地方,很多人相当然的认为 ColorCode.RED 与 1 是相等的,但真实的结果却是 False,RED 是一项枚举,枚举有name 和 value 两个属性,必须通过 value 才能获得真实的枚举值

print(ColorCode.RED.value == 1)       		# True

或者换一个思路,将枚举值转成枚举类型

print(ColorCode.RED == ColorCode(1))       # True

3.4. 是否属于枚举

print(2 in {item.value for item in Color})	# True

4. 实例

from enum import Enum# 定义一个枚举类型
class Color(Enum):RED     = 1GREEN   = 2BLUE    = 3# # 要判断的值
# value_to_check = 2# # 判断值是否在枚举的有效范围内
# is_in_enum_range = value_to_check in Color.__members__# print(is_in_enum_range)  			# 输出: False
print(Color.__members__.keys())		# dict_keys(['RED', 'GREEN', 'BLUE'])
print(Color.__members__.values())	# dict_values([<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>])

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

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

相关文章

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构&#xff0c;与单向链表相比可以有更多的应用场景&#xff0c;本文讨论双向链表的基本概念及实现方法&#xff0c;并着重介绍使用GLib的GList实现单向链表的方法及步骤&#xff0c;本文给出了多个实际范例源代码&#xff0c;旨在帮助…

MySQL 数据库之库操作

文章目录 1. 什么是数据库2. 基础概念2.1 连接数据库2.2 服务器&#xff0c;数据库&#xff0c;表关系2.3 SQL分类 3. 库的操作3.1 创建&#xff0c;选择&#xff0c;查看数据库3.2 字符集和默认校验规则 3.3 操纵数据库3.3.1 数据库查看3.3.2 数据库删除3.3.3 数据库修改 4. 其…

Windows安装多个NodeJS版本

下载nvm管理工具&#xff0c;下载完成解压安装 https://github.com/coreybutler/nvm-windows/releases 选择nvm安装位置 选择nvm安装node版本的安装位置 如果提示你已经安装的有nodejs&#xff0c;提示你是否通过nvm管理nodejs&#xff0c;选择是&#xff0c;继续安装即可…

使用NVM自由切换nodejs版本

一、NVM介绍 在日常开发中&#xff0c;我们可能需要同时进行多个不同NodeJS版本的项目开发&#xff0c;每个项目所依赖的nodejs版本可能不一致&#xff0c;我们如果只安装一个版本的nodejs&#xff0c;就可能出现node版本冲突问题&#xff0c;导致项目无法启动。这种情况下&am…

parseInt 是一个内置的 JavaScript 函数,用于将字符串转换为整数。

parseInt(options.checkNumber, 10) 中的 10 表示将字符串转换为十进制整数。 解释 parseInt 函数&#xff1a; parseInt 是一个内置的 JavaScript 函数&#xff0c;用于将字符串转换为整数。它有两个参数&#xff1a; 第一个参数是要转换的字符串。第二个参数是转换时使用的基…

Qt中的Model与View 4:QStandardItemModel与QTableView

目录 QStandardItemModel API QTableView 导航 视觉外观 坐标系统 API 样例&#xff1a;解析一个表格txt文件 QStandardItemModel QStandardItemModel 可用作标准 Qt 数据类型的存储库。它是模型/视图类之一&#xff0c;是 Qt 模型/视图框架的一部分。它提供了一种基于…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十九集:制作过场Cutscene系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作过场Cutscene系统 1.制作基本的视频过场和动画过场2.制作决定过场系统的播放顺序Sequence以及切换场景以后的逻辑处理二、制作跳过过场Cutscene的MenuS…

【设计模式系列】桥接模式(十三)

一、什么是桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式主要用于处理那些在设计时无法确定实现细节的场合&#xff0c;或者需要在多个实现之间…

基于Multisim光控夜灯LED电路(含仿真和报告)

【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 光控夜灯LED电路 1.采用纯数字电路&#xff0c;非单片机。 2.通过检测周围光线&#xff0c;光线暗自…

html练习2

实现下列图片的效果 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}#menu {background-color: #0c0048;width: 100%;height: 50px;margin: auto;…

【毫米波雷达(八)】车载毫米波前雷达遮挡检测功能

车载毫米波前雷达遮挡检测功能 一、概念二、功能指标1、遮挡检测功能2、功能流程3、实车验证 一、概念 随着汽车行业智能化发展&#xff0c;车载毫米波雷达在汽车市场应用越来越广泛。在驾驶过程中&#xff0c;当雷达受到泥土、纸巾、冰雪覆盖遮挡后&#xff0c;雷达检测性能受…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

java面试2.0

一.Zookeeper 1.定义 ZooKeeper 是一个开源的分布式协调服务&#xff0c;它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&#xff0c;并以一系列简单易用的接口提供给用户使用。 ZooKeeper 为我们提供了高可用、高性能…

游戏测试|超越QA的常规:我们如何自动化回归测试

QA测试工作并不单调乏味&#xff0c;它是一项创造性的工作&#xff0c;蕴含着丰富的机会。公平地说&#xff0c;它也有枯燥乏味的一面--回归&#xff08;regression&#xff09;。因此&#xff0c;我们决定将回归测试自动化&#xff0c;具体方法如下。 ​ 在IT行业&#xff0c…

群分解(Swarm Decomposition,SWD)

代码原理 群体分解&#xff08;SWD&#xff09;是一种用于信号处理和数据分析的新兴方法。它通过将复杂的信号分解为多个群体成分&#xff08;Swarm Components&#xff09;&#xff0c;每个成分代表信号中的特定特征或模式。SWD的主要目标是提取信号中的不同特征模式&#xf…

flink实战-- flink任务的火焰图如何使用

火焰图 Flame Graphs 是一种有效的可视化工具,可以帮助我们排查如下问题: 目前哪些方法正在消耗 CPU 资源?一个方法的消耗与其他方法相比如何?哪一系列的堆栈调用导致了特定方法的执行?y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 解决方案三&#xff1a; 1.浮动高度塌陷概念 在CSS中&#xff0c;高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

拒绝事后背锅:测试项目中的风险管理一定要知道

在博主的公司中&#xff0c;测试经理除了要管理产品线的质量保障和日常部门事务工作外&#xff0c;另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展&#xff0c;而是想聊一聊在同行中比较高频出现的一个字眼&#xff1a;风险管理。 什么是风…

基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)

1.概述 比较排序算法 算法最好最坏平均空间稳定思想注意事项冒泡O(n)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)Y比较最好情况需要额外判断选择O( n 2 n^2 n2)O( n 2 n^2 n2)O( n 2 n^2 n2)O(1)N比较交换次数一般少于冒泡堆O( n l o g n nlogn nlogn)O( n l o g n nlogn nlogn)O( n l…

利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印

现在很多场合需要将PDF或图片加水印&#xff0c;本程序利用pythonstudio编写。 第一步 界面 其中&#xff1a; LstMask:列表框 PopupMenu:PmnMark LstFiles:列表框 PopupMenu:PmnFiles OdFiles:文件选择器 Filter:PDF文件(.PDF)|.PDF|图像文件(.JPG)|.JPG|图像文件(.png…