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之Python安装
Sep 12 Python
利用python写个下载teahour音频的小脚本
May 08 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
python实现简单名片管理系统
Nov 30 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
使用Python在Windows下获取USB PID&amp;VID的方法
Jul 02 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
PageFactory设计模式基于python实现
Apr 14 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
Python做简单的字符串匹配详解
2017/03/21 Python
python ddt实现数据驱动
2018/03/14 Python
浅谈Python的list中的选取范围
2018/11/12 Python
为什么相对PHP黑python的更少
2020/06/21 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
简单说说tomcat的配置
2013/05/28 面试题
什么是规则表达式
2012/05/03 面试题
车间班长岗位职责
2013/11/30 职场文书
简单英文演讲稿
2014/01/01 职场文书
美德好少年主要事迹
2014/01/29 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
大学校务公开实施方案
2014/03/31 职场文书
万能检讨书
2015/01/27 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技