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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
python使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
python之yield表达式学习
Sep 02 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
代码实例讲解python3的编码问题
Jul 08 Python
Django 路由控制的实现
Jul 17 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
python之yield和Generator深入解析
Sep 18 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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错误、异常处理类
2014/03/21 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
jQuery之按钮组件的深入解析
2013/06/19 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python抓取百度首页的方法
2015/05/19 Python
Python中属性和描述符的正确使用
2016/08/23 Python
深入理解Python3中的http.client模块
2017/03/29 Python
python实现验证码识别功能
2018/06/07 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
python 元组和列表的区别
2020/12/30 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
学生会竞选自荐信
2013/10/12 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android