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标准库os.path包、glob包使用实例
Nov 25 Python
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
Python 12306抢火车票脚本
Feb 07 Python
Python File readlines() 使用方法
Mar 19 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
pygame实现成语填空游戏
Oct 29 Python
Keras实现将两个模型连接到一起
May 23 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
pandas 数据类型转换的实现
Dec 29 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
PHP4在Windows2000下的安装
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
javascript每日必学之循环
2016/02/19 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
原生JS实现的轮播图功能详解
2018/08/06 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
python pycharm的安装及其使用
2019/10/11 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
Python使用Pygame绘制时钟
2020/11/29 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
奥巴马英文演讲稿
2014/05/15 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
项目投资意向书范本
2015/05/09 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
python实现图片九宫格分割的示例
2021/04/25 Python