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中二维阵列的变换实例
Oct 09 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
python操作redis方法总结
Jun 06 Python
python实现学员管理系统
Feb 26 Python
python Django的web开发实例(入门)
Jul 31 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
解决Pycharm 运行后没有输出的问题
Feb 05 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python 常用string函数详解
2016/05/30 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
班训口号大全
2014/06/18 职场文书
2015年党建工作总结
2015/03/30 职场文书
Python字典的基础操作
2021/11/01 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers