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 import用法以及与from...import的区别
May 28 Python
Python的time模块中的常用方法整理
Jun 18 Python
Python中列表、字典、元组数据结构的简单学习笔记
Mar 20 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
python pandas库的安装和创建
Jan 10 Python
python根据时间获取周数代码实例
Sep 30 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
Python数据模型与Python对象模型的相关总结
Jan 26 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实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP面向对象精要总结
2014/11/07 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
function foo的原型与prototype属性解惑
2010/11/19 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
webpack打包js的方法
2018/03/12 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
策划总监岗位职责
2014/02/16 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
预防传染病方案
2014/06/14 职场文书
理财计划书
2014/08/14 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
货款欠条范本
2015/07/03 职场文书
浅谈MySQL之select优化方案
2021/08/07 MySQL