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求众数问题实例
Sep 26 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
对Python协程之异步同步的区别详解
Feb 19 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
在Python中实现函数重载的示例代码
Dec 12 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
python绘制雷达图实例讲解
Jan 03 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
python基础之//、/与%的区别详解
Jun 10 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/22 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python实现简单井字棋游戏
2020/03/04 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
保护野生动物倡议书
2014/05/16 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
酒店辞职书范文
2015/02/26 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
导游词之襄阳古城
2019/09/27 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
Django框架模板用法详解
2022/06/10 Python