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编程中进行迭代和遍历
Jan 19 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
详解Python中的分支和循环结构
Feb 11 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
python安装第三方库如xlrd的方法
Oct 31 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
Python利用FlashText算法实现替换字符串
Mar 31 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP设计聊天室步步通
2006/10/09 PHP
简单的页面缓冲技术
2006/10/09 PHP
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
python3 图片referer防盗链的实现方法
2018/03/12 Python
python实现学员管理系统
2019/02/26 Python
python实现桌面托盘气泡提示
2019/07/29 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
厨师岗位职责
2013/11/12 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis