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 相关文章推荐
Python中运行并行任务技巧
Feb 26 Python
python获取多线程及子线程的返回值
Nov 15 Python
python八大排序算法速度实例对比
Dec 06 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
python2与python3共存问题的解决方法
Sep 18 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python re.sub 反向引用的实现
Jul 07 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 图片上添加透明度渐变的效果
2009/06/29 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
zend framework重定向方法小结
2016/05/28 PHP
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python爬取m3u8连接的视频
2018/02/28 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python递归函数实例讲解
2019/02/27 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
工作决心书
2014/03/11 职场文书
导游个人求职信
2014/04/25 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
女方离婚起诉书
2015/05/18 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS