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中list常用操作实例详解
Jun 03 Python
在Django的视图中使用form对象的方法
Jul 18 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
对pandas replace函数的使用方法小结
May 18 Python
python实现音乐下载的统计
Jun 20 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
对python实现合并两个排序链表的方法详解
Jan 23 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
如何在scrapy中捕获并处理各种异常
Sep 28 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
ini_set的用法介绍
2014/01/07 PHP
php数组去重复数据示例
2014/02/25 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
高中地理教学反思
2014/01/29 职场文书
统计系教授推荐信
2014/02/28 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers