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中的exec、eval使用实例
Sep 23 Python
python二分查找算法的递归实现方法
May 12 Python
彻底搞懂Python字符编码
Jan 23 Python
python使用Tesseract库识别验证
Mar 21 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
python绘制趋势图的示例
Sep 17 Python
python链表类中获取元素实例方法
Feb 23 Python
python迷宫问题深度优先遍历实例
Jun 20 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
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Django实现网页分页功能
2019/10/31 Python
Python上下文管理器全实例详解
2019/11/12 Python
django框架两个使用模板实例
2019/12/11 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
pytorch实现查看当前学习率
2020/06/24 Python
python 实现超级玛丽游戏
2020/11/25 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
焦裕禄精神心得体会
2014/09/02 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
工作自我评价范文
2015/03/05 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书