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 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python中的匿名函数使用简介
Apr 27 Python
Python中关于使用模块的基础知识
May 24 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
Python numpy 常用函数总结
Dec 07 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
Python神奇的内置函数locals的实例讲解
Feb 22 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
教你利用python实现企业微信发送消息
May 23 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利用cookie实现访问次数统计代码
2011/05/19 PHP
PHP实现下载功能的代码
2012/09/29 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
出生医学证明样本
2014/01/17 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
国际贸易求职信
2014/07/05 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
电工实训报告总结
2014/11/05 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏