Python中的枚举类型示例介绍


Posted in Python onJanuary 09, 2019

起步

Python 的原生类型中并不包含枚举类型。为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库。

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。在没有专门提供枚举类型的时候我们是怎么做呢,一般就通过字典或类来实现:

Color = {
 'RED' : 1,
 'GREEN': 2,
 'BLUE' : 3,
}

class Color:
 RED = 1
 GREEN = 2
 BLUE = 3

这种来实现枚举如果小心翼翼地使用当然没什么问题,毕竟是一种妥协的解决方案。它的隐患在于可以被修改。

使用 Enum

更好的方式是使用标准库提供的 Enum 类型,官方库值得信赖。3.4 之前的版本也可以通过 pip install enum 下载支持的库。简单的示例:

from enum import Enum
class Color(Enum):
 red = 1
 green = 2
 blue = 3

枚举成员有值(默认可重复),枚举成员具有友好的字符串表示:

>>> print(Color.red)
Color.red
>>> print(repr(Color.red))
<Color.red: 1>
>>> type(Color.red)
<Enum 'Color'>
>>> isinstance(Color.green, Color)
True

枚举类型不可实例化,不可更改。

定义枚举

定义枚举时,成员名不允许重复

class Color(Enum):
 red = 1
 green = 2
 red = 3 # TypeError: Attempted to reuse key: 'red'

成员值允许相同,第二个成员的名称被视作第一个成员的别名

class Color(Enum):
 red = 1
 green = 2
 blue = 1

print(Color.red)    # Color.red
print(Color.blue)    # Color.red
print(Color.red is Color.blue)# True
print(Color(1))    # Color.red 在通过值获取枚举成员时,只能获取到第一个成员

若要不能定义相同的成员值,可以通过 unique 装饰

from enum import Enum, unique
@unique
class Color(Enum):
 red = 1
 green = 2
 blue = 1 # ValueError: duplicate values found in <enum 'Color'>: blue -> red

枚举取值

可以通过成员名来获取成员也可以通过成员值来获取成员:

print(Color['red']) # Color.red 通过成员名来获取成员

print(Color(1))  # Color.red 通过成员值来获取成员

每个成员都有名称属性和值属性:

member = Color.red
print(member.name) # red
print(member.value) # 1

支持迭代的方式遍历成员,按定义的顺序,如果有值重复的成员,只获取重复的第一个成员:

for color in Color:
 print(color)

特殊属性 __members__ 是一个将名称映射到成员的有序字典,也可以通过它来完成遍历:

for color in Color.__members__.items():
 print(color)   # ('red', <Color.red: 1>)

枚举比较

枚举的成员可以通过 is 同一性比较或通过 == 等值比较:

Color.red is Color.red
Color.red is not Color.blue

Color.blue == Color.red
Color.blue != Color.red

枚举成员不能进行大小比较:

Color.red < Color.blue # TypeError: unorderable types: Color() < Color()

扩展枚举 IntEnum

IntEnum 是 Enum 的扩展,不同类型的整数枚举也可以相互比较:

from enum import IntEnum
class Shape(IntEnum):
 circle = 1
 square = 2

class Request(IntEnum):
 post = 1
 get = 2

print(Shape.circle == 1)   # True
print(Shape.circle < 3)    # True
print(Shape.circle == Request.post) # True
print(Shape.circle >= Request.post) # True

总结

enum 模块功能很明确,用法也简单,其实现的方式也值得学习,有机会的话可以看看它的源码。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python对数组进行反转的方法
May 20 Python
Python进阶篇之字典操作总结
Nov 16 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python编辑用户登入界面的实现代码
Jul 16 Python
Python多线程原理与用法详解
Aug 20 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
一行Python代码过滤标点符号等特殊字符
Aug 12 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
公认8个效率最高的爬虫框架
Jul 28 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
利用python提取wav文件的mfcc方法
Jan 09 #Python
Python Matplotlib库安装与基本作图示例
Jan 09 #Python
对Python使用mfcc的两种方式详解
Jan 09 #Python
Python中的 enum 模块源码详析
Jan 09 #Python
python linecache 处理固定格式文本数据的方法
Jan 08 #Python
Python 调用PIL库失败的解决方法
Jan 08 #Python
解决pyinstaller打包pyqt5的问题
Jan 08 #Python
You might like
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
繁简字转换功能
2006/07/19 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
使用python实现strcmp函数功能示例
2014/03/25 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
详解Python核心对象类型字符串
2018/02/11 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
快速查找Python安装路径方法
2020/02/06 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
总会计师岗位职责
2014/02/19 职场文书
新春寄语大全
2014/04/09 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL