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列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
python3.6的venv模块使用详解
Aug 01 Python
对python判断是否回文数的实例详解
Feb 08 Python
set在python里的含义和用法
Jun 24 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
python 求10个数的平均数实例
Dec 16 Python
pyautogui自动化控制鼠标和键盘操作的步骤
Apr 01 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python基于unittest实现测试用例执行
Nov 25 Python
python套接字socket通信
Apr 01 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无敌近乎加密方式!
2010/07/17 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
php遍历目录方法小结
2015/03/10 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
laravel5.6实现数值转换
2019/10/23 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
js DOM的学习笔记
2011/12/22 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
AngularJS基础知识
2014/12/21 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python tqdm库的使用
2020/11/30 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
监理资料员岗位职责
2014/01/03 职场文书
打架检讨书100字
2014/01/19 职场文书
写自荐信的注意事项
2014/03/09 职场文书
借款担保书范文
2014/05/13 职场文书
党员干部一句话承诺
2014/05/30 职场文书
2014年路政工作总结
2014/12/10 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python