枚举

枚举的作用就是定义一组 数据形式为 dict 但却又不可变的常量

比如我们定义一个类,或者定义一个dict ,类中的成员变量可以被更改,而且类又可以被实例化,dict 里面的值也可以被更改。

如下:

WEEKDAY = {'MON': 1,'TUS': 2,'WEN': 3,'THU': 4,'FRI': 5
}
class Color:RED   = 0GREEN = 1BLUE  = 2

所以就衍生出了枚举,用来声明多组键值对,且一旦声明,其值不允许被修改。

声明方式一:

最简单的声明枚举的方式如下:

>>> from enum import Enum
>>> Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

解释一下 :

首先 枚举类里面存放的是 多组  key = value 形式的 键值对, 每一组  key = value 被称为 一个成员,key称为成员的名字,value称为成员的值。

Enum() 创建一个枚举对象,然后传了两个参数,第一个参数为我们枚举类的类名,第二个参数是一个元组,元组中的每一个元素就是 成员的名字,上面的这种创建枚举对象的方式 每一个成员的值 会被自动赋予,从1开始,然后逐个递增1.

我们通过for循环遍历输出一下

>>> for member in Month:print(member)Month.Jan
Month.Feb
Month.Mar
Month.Apr
Month.May
Month.Jun
Month.Jul
Month.Aug
Month.Sep
Month.Oct
Month.Nov
Month.Dec

通过上面的输出我们无法看到成员的值,其实我们可以通过member获取到

>>> for member in Month:print(member,member.name,member.value)Month.Jan Jan 1
Month.Feb Feb 2
Month.Mar Mar 3
Month.Apr Apr 4
Month.May May 5
Month.Jun Jun 6
Month.Jul Jul 7
Month.Aug Aug 8
Month.Sep Sep 9
Month.Oct Oct 10
Month.Nov Nov 11
Month.Dec Dec 12

通过这种方式声明枚举对象不允许出现相同的 成员名

>>> Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec','Dec'))
Traceback (most recent call last):File "<pyshell#68>", line 1, in <module>Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec','Dec'))File "D:\工作软件\python\lib\enum.py", line 309, in __call__return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start)File "D:\工作软件\python\lib\enum.py", line 420, in _create_classdict[member_name] = member_valueFile "D:\工作软件\python\lib\enum.py", line 100, in __setitem__raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'Dec'

再说一下枚举对象中的值获取方式

1: 枚举对象名(成员值)  获取成员

>>> print(Weekday(6))
Weekday.Sat

2:枚举对象名['成员名']  获取成员

>>> print(Weekday['Sun'])
Weekday.Sun

3:通过 枚举对象名.成员名 直接获取成员

>>> print(Weekday.Sat)
Weekday.Sat

4:通过成员.name 和 成员.value 分别获取 成员名 和 成员值

>>> print(Weekday.Sat.name)
Sat
>>> print(Weekday.Sat.value)
6

声明方式二:  可以自己设定成员的值

>>> class Weekday(Enum):Sun = 0  #默认是从 1开始的,我们自己可以设定从 0 开始Mon = 1Tue = 2Wed = 3Thi = 4Fri = 5Sat = 6

同样 也不允许成员名相同

class Weekday(Enum):Sun = 0Mon = 1Tue = 2Wed = 3Thi = 4Fri = 5Sat = 6Sat = 7Traceback (most recent call last):File "<pyshell#71>", line 1, in <module>class Weekday(Enum):File "<pyshell#71>", line 9, in WeekdaySat = 7File "D:\工作软件\python\lib\enum.py", line 100, in __setitem__raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'Sat'

但是,因为这种是自己设置成员值,所以可能会出现成员值 相同的情况

class Weekday(Enum):Sun = 0Mon = 1Tue = 2Wed = 3Thi = 4Fri = 5Sat = 6Sats = 6

如果值相同的话,我们通过成员值 去获取 成员的话,只能获取到 第一个成员

>>> print(Weekday(6).name)
Sat

通过for 循环迭代的话,也获取不到Sats

>>> for member in Weekday:print(member,member.name,member.value)Weekday.Sun Sun 0
Weekday.Mon Mon 1
Weekday.Tue Tue 2
Weekday.Wed Wed 3
Weekday.Thi Thi 4
Weekday.Fri Fri 5
Weekday.Sat Sat 6

但是枚举对象中有一个属性  __members__,我们可以通过它获取到值相同的成员。

>>> for name in Weekday.__members__:print(name)Sun
Mon
Tue
Wed
Thi
Fri
Sat
Sats

上面返回的成员名

Weekday.__members__对象还可以调用 iterms()函数,这样成员所有的信息都可以获取到

>>> for name,member in Weekday.__members__.items():print(member,name,member.value)Weekday.Sun Sun 0
Weekday.Mon Mon 1
Weekday.Tue Tue 2
Weekday.Wed Wed 3
Weekday.Thi Thi 4
Weekday.Fri Fri 5
Weekday.Sat Sat 6
Weekday.Sat Sats 6

如果想对成员值进行限制,不允许出现重复的成员值,我们需要用到@unique装饰器

>>> @unique
class Weekday(Enum):Sun = 0 Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6Sats = 6Traceback (most recent call last):File "<pyshell#102>", line 2, in <module>class Weekday(Enum):File "D:\工作软件\python\lib\enum.py", line 860, in unique(enumeration, alias_details))
ValueError: duplicate values found in <enum 'Weekday'>: Sats -> Sat

python学习笔记(十五) -- 枚举相关推荐

  1. python学习笔记十五:日期时间处理笔记

    #-*- coding: utf-8 -*- import datetime#给定日期向后N天的日期 def dateadd_day(days):d1 = datetime.datetime.now( ...

  2. python复制指定字符串_python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  3. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  4. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  5. python学习笔记(五)缩进

    python学习笔记(五)缩进 原作:http://www.cnblogs.com/vamei/archive/2012/05/29/2524706.html 笔记: #!/usr/bin/env p ...

  6. 5岁自学python编程-python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹...

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  7. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

  8. python学习[第十五篇] 文件系统

    python学习[第十五篇] 文件系统 对文件系统访问大多数都通过os模块实现. os 模块文件/目录访问函数 文件处理 mkfifo() 创建命名通道只用于linux remove(path)/un ...

  9. python学习笔记(五)---替换函数

    python学习笔记(五)-替换函数 replace()函数替换内容 用法: replace('需要替换的内容','替换后的内容',替换次数) 备:如果需要替换单引号需要加'\' 例子: str = ...

最新文章

  1. 面试官:为什么需要 Hystrix?
  2. 任务流程管理,从繁杂的项目管理中解脱出来
  3. spring 获取配置文件的值
  4. imageDownloader
  5. Razor语法和Razor引擎大全
  6. 复选框怎么点td选中_jQuery点击tr实现checkbox选中的方法
  7. php 上传根目录不存在,Linux 下 ---ThinkPHP 图片上传提示:上传根目录不存在!请尝试手动创建...
  8. react 怎么获取表格_react学习之js-xlsx导入和导出excel表格
  9. c语言程序可以从任何函数开始执行,C语言-基本选择题及参考答案
  10. LaTex ——P2 源文件的基本结构
  11. PyQt5 QComboBox 样例代码
  12. 线性表的顺序存储结构--数组(顺序表)、栈、队列
  13. kafka彻底删除topic清理数据
  14. exls表格搜索快捷键_excel表格查找数据查找出来的-如何在一份Excel表格中进行快速查找,快捷键是?...
  15. Cesium3Dtilesets 使用customShader的解读以及泛光效果示例
  16. 莫队算法(小Z的袜子)
  17. 看过来!看过来!网络安全类的认证课程都在这里
  18. Found conflicts! Looking for incompatible packages. This can take several minutes. Press CTRL-C
  19. 学完计算机网络基础及应用的感想,学习《计算机网络基础知识》心得体会
  20. 简述相关与回归分析的关系_浅谈相关分析与回归分析的关系

热门文章

  1. RuoYi-Flowable-Plus(代码生成)
  2. ruoyi-cloud新建子模块
  3. 企业参加社会保险须知(缴费比例表)
  4. fetch 请求详解
  5. 切割优化模型可以用c语言编程不,数学算法对计算机编程优化研究
  6. 微信小程序网悦新闻开发--云函数以及云数据开发(七)
  7. Windows批处理:命令if
  8. html字体设置大小打印无效,使用css中的zoom:50%后对页面文字大小不生效,什么原因?...
  9. 剑指offer:圆圈中最后剩下的数
  10. Python入门(1)