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进阶教程之循环对象
Aug 30 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
浅谈Python的Django框架中的缓存控制
Jul 24 Python
Python编程之event对象的用法实例分析
Mar 23 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python使用pyserial进行串口通信的实例
Jul 02 Python
python yield关键词案例测试
Oct 15 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python实现飞船大战
Apr 24 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 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.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
Array.prototype.slice.apply的使用方法
2010/03/17 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python操作mongodb的9个步骤
2018/06/04 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
利用nohup来开启python文件的方法
2019/01/14 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
个人现实表现材料
2014/02/04 职场文书
志愿者活动总结范文
2014/04/26 职场文书
应聘会计求职信
2014/06/11 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
学生违反校规检讨书
2014/10/28 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
详解nginx location指令
2022/01/18 Servers
Mysql开启外网访问
2022/05/15 MySQL
详解SQL报错盲注
2022/07/23 SQL Server