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 相关文章推荐
web.py 十分钟创建简易博客实现代码
Apr 22 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
人脸识别经典算法一 特征脸方法(Eigenface)
Mar 13 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
Python实战之制作天气查询软件
May 14 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
python如何实现DES加密
Sep 21 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 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代码
2012/07/17 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
Vue计算属性的使用
2017/08/04 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
python删除不需要的python文件方法
2018/04/24 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
英国袜子店:Sock Shop
2017/01/11 全球购物
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
大学生校园创业计划书
2014/02/08 职场文书
车辆转让协议书
2014/04/15 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js
python解析json数据
2022/04/29 Python