python3 enum模块的应用实例详解


Posted in Python onAugust 12, 2019

一、枚举与字典类型

字典类型的缺点:

1.值可变
2.没有防止相同标签的功能

枚举的特点:
1.枚举类的值不可以被外界更改
2.不能存在相同的标签,但允许不同标签存在相同的枚举值,即后者相当于前者的别名
3.枚举值可以是任意类型
4.枚举标签尽量用大写

from enum import Enum #普通类
class dict():
  green = 1
  green = 2
  red = 3
dict.red = 4  
print(dict.red)
>>> 4
class VIP(Enum): 
  RED = 1
  GREEN =2
  YELLOW = 3
VIP.GREEN = 5 #枚举值不能动态更改
>>>File "D:\python\lib\enum.py", line 361, in __setattr__
raise AttributeError('Cannot reassign members.')

AttributeError: Cannot reassign members.
class VIP(Enum):
  RED = 1
  GREEN =2
  YELLOW = 3
  YELLOW = 3 #不能出现相同的标签
>>>File "D:\python\lib\enum.py", line 92, in __setitem__
    raise TypeError('Attempted to reuse key: %r' % key)
    TypeError: Attempted to reuse key: 'YELLOW'
class VIP(Enum):
  RED = 1
  GREEN =2
  YELLOW = 3
  BLUE = 3
print(VIP.BLUE)
>>>VIP.YELLOW  #即VIP.BLUE类似于VIP.YELLOW的别名
class VIP(Enum):
  RED = 1 #整型
  BLUE = 1.2 #浮点型
  GREEN = 'green' #str
  YELLOW = True #布尔值

二、枚举类型、枚举名称、枚举值

1.获取枚举类型中的标签:.name属性

2.获取枚举类型中的值:.value属性

from enum import Enum
class VIP(Enum):
  RED = 1
  GREEN = 'green'
  YELLOW = True
  BLUE = 1.2
print(VIP.RED) #枚举的类型
print(VIP.YELLOW.name)  #枚举的标签
print(VIP.YELLOW.value)  #枚举的数值
print('遍历成员。。。')
for i in VIP.__members__.items():  #枚举的遍历
  print(i)
>>>
VIP.RED
RED
1
遍历成员。。。
('RED', <VIP.RED: 1>)
('GREEN', <VIP.GREEN: 'green'>)
('YELLOW', <VIP.RED: 1>)
('BLUE', <VIP.BLUE: 1.2>)

三、枚举的比较运算

class VIP(Enum):
  RED = 1
  GREEN = 'green'
  YELLOW = True
  BLUE = 2
#枚举的比较
a = VIP.RED == VIP.RED #枚举值可以做等值比较
b = VIP.RED == VIP.GREEN
c = VIP.RED is VIP.RED
d = VIP.RED == 1 #枚举标签与枚举值比较,并不相等
f = VIP.RED < VIP.BLUE #枚举值不支持大小比较,打印会报错TypeError: '<' not supported between instances of 'VIP' and 'VIP'
print(a)
print(b)
print(c)
print(d)
>>>
True
False
True
False

四、枚举的转换

class VIP(Enum):
  RED = 1
  GREEN = 'green'
  YELLOW = True
  BLUE = 2
print(VIP(2))  #通过具体值获取枚举类型,返回VIP.BLUE
print(VIP('green'))  #返回VIP.GREEN

五、枚举的拓展unique

unique:规定两个不同的枚举不能取相同的值

from enum import Enum,unique
@unique
class VIP(Enum):
  RED = 1
  GREEN = 1
  YELLOW = True
  BLUE = 2
>>>报错
ValueError: duplicate values found in <enum 'VIP'>: GREEN -> RED, YELLOW -> RED

六、枚举的拓展auto

如果我们对枚举值没有特别的要求或者没有太大的影响时,我们可以使用auto自动生成对应的数值

from enum import Enum,auto
class VIP(Enum):
  RED = auto()
  GREEN = auto()
  YELLOW = auto()
  BLUE = auto()
for i in VIP.__members__.items():  #遍历枚举
  print(i)
>>>
('RED', <VIP.RED: 1>)
('GREEN', <VIP.GREEN: 2>)
('YELLOW', <VIP.YELLOW: 3>)
('BLUE', <VIP.BLUE: 4>)

其实,auto值是调用_generate_next_value_()函数来产生的,我们可以通过重写该函数

from enum import Enum,auto
class auto_test(Enum):
  def _generate_next_value_(name, start, count, last_values):
    return name
class VIP(auto_test):
  RED = auto()
  GREEN = auto()
  YELLOW = auto()
  BLUE = auto()
# for i in VIP.__members__.items(): #遍历枚举
#   print(i)
print(list(VIP))  #转换列表
>>>
[<VIP.RED: 'RED'>, <VIP.GREEN: 'GREEN'>, <VIP.YELLOW: 'YELLOW'>, <VIP.BLUE: 'BLUE'>]

总结

以上所述是小编给大家介绍的python3 enum模块的应用实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Django Admin实现上传图片校验功能
Mar 06 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 Python
python 随机森林算法及其优化详解
Jul 11 Python
django框架使用方法详解
Jul 18 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 #Python
django+echart数据动态显示的例子
Aug 12 #Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 #Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 #Python
python内存管理机制原理详解
Aug 12 #Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 #Python
python实现图片压缩代码实例
Aug 12 #Python
You might like
深入PHP与浏览器缓存的分析
2013/06/03 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
javascript操作cookie
2017/01/17 Javascript
原生js实现轮播图
2017/02/27 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
基于python的汉字转GBK码实现代码
2012/02/19 Python
wxPython之解决闪烁的问题
2018/01/15 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
python IP地址转整数
2020/11/20 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
历史专业大学生职业生涯规划书
2014/03/13 职场文书
数控专业自荐书范文
2014/03/16 职场文书
股份转让协议书
2014/04/12 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
政风行风自查自纠报告
2014/10/21 职场文书