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入门篇之字典
Oct 17 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
python基础入门学习笔记(Python环境搭建)
Jan 13 Python
Phantomjs抓取渲染JS后的网页(Python代码)
May 13 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
python 3.6.5 安装配置方法图文教程
Sep 18 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
python palywright库基本使用
Jan 21 Python
python包的导入方式总结
Mar 02 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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&amp;mysql(二)
2006/10/09 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
vue配置请求本地json数据的方法
2018/04/11 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
Python实现按中文排序的方法示例
2018/04/25 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
详解canvas.toDataURL()报错的解决方案全都在这了
2020/03/31 HTML / CSS
如何开发安全的AJAX应用
2014/03/26 面试题
支部组织生活会方案
2014/06/10 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
开票员岗位职责
2015/02/12 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
地震捐款简报
2015/07/21 职场文书
如何在Python中创建二叉树
2021/03/30 Python
Python实现天气查询软件
2021/06/07 Python
Python中的套接字编程是什么?
2021/06/21 Python
JUnit5常用注解的使用
2021/07/02 Java/Android
Java完整实现记事本代码
2022/06/16 Java/Android