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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
python使用正则表达式提取网页URL的方法
May 26 Python
python rsa 加密解密
Mar 20 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python实现按中文排序的方法示例
Apr 25 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
python使用webdriver爬取微信公众号
Aug 31 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
keras中的backend.clip用法
May 22 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
利用Python过滤相似文本的简单方法示例
Feb 03 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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读取csv文件内容的详解
2013/06/18 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python3.x上post发送json数据
2018/03/04 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
深入解析神经网络从原理到实现
2019/07/26 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
python获取栅格点和面值的实现
2020/03/10 Python
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
校长先进事迹材料
2014/02/01 职场文书
敬老院活动总结
2014/04/28 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
119消防日活动总结
2014/08/29 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
违纪检讨书范文
2015/01/27 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
企业党建工作总结2015
2015/05/26 职场文书
工商局调档介绍信
2015/10/22 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP