一.枚举其实是一个类

建议标识名字用大写

1.枚举类:

  1. from enum import Enum
  2.  
  3. class VIP(Enum):
  4.  
  5.     YELLOW = 1
  6.  
  7.     GREEN = 2
  8.  
  9.     BLACK = 3
  10.  
  11.     RED = 4
  12.  
  13. print(VIP.YELLOW)
  14.  
  15. #VIP.YELLOW    #关注的是它的标签不是数字

2 枚举和普通类相比的优势

三种其他的普通方法表示枚举:

  1. 1
  2.  
  3. yellow = 1
  4.  
  5. green = 2
  6.  
  7. 2)字典的表示方式
  8.  
  9. {'yellow':1,'green':2}
  10.  
  11. 3)类的表示方式
  12.  
  13. class TypeDiamond():
  14.  
  15. yellow = 1
  16.  
  17. green = 2

这些方式,它们都是可变的,可以在代码中轻易的更改值,且没有防止相同标签的功能。

3.枚举的特点:

  1. from enum import Enum
  2.  
  3. class VIP(Enum):
  4.  
  5.     YELLOW = 1
  6.  
  7.    #YELLOW= 2   #不可重复,报错
  8.  
  9.     BLACK = 3
  10.  
  11.     RED = 4
  12.  
  13. print(VIP.YELLOW)
  14.  
  15. #VIP.YELLOW = 6    #不可更改,报错

二.枚举类型、枚举名称与枚举值

1.获取枚举类型下某一数值:

  1. from enum import Enum
  2.  
  3. class VIP(Enum):
  4.  
  5.     YELLOW = 1
  6.  
  7.     GREEN = 2
  8.  
  9.     BLACK = 3
  10.  
  11.     RED = 4
  12.  
  13.     
  14.  
  15. print(VIP.YELLOW.value)
  16.  
  17. print(VIP.YELLOW.name)
  18.  
  19. print(VIP.YELLOW)
  20.  
  21. print(VIP['YELLOW'])
  22.  
  23. #1 #枚举值
  24.  
  25. #YELLOW    #<class 'str'> 获取标签名
  26.  
  27. #VIP.YELLOW    #<enum 'VIP'>    枚举类型
  28.  
  29. #VIP.YELLOW    

2.枚举是可以遍历的:

  1. from enum import Enum
  2.  
  3. class VIP(Enum):
  4.  
  5.     YELLOW = 1
  6.  
  7.     GREEN = 2
  8.  
  9.     BLACK = 3
  10.  
  11.     RED = 4
  12.  
  13. for v in VIP :
  14.  
  15.     print(v)
  16.  
  17. #VIP.YELLOW
  18. VIP.GREEN
  19. VIP.BLACK
  20. VIP.RED

三. 枚举的比较运算

1.两个枚举之间可以使用等值比较(==),枚举与数值比较的判断结果不对。两个枚举之间不能进行大小比较。

2.支持is操作:

  1. result = VIP.GREEN is VIP.GREEN
  2.  
  3. #True

3.两个大类之间也可以进行等值比较,不过结果是False:

  1. from enum import Enum
  2.  
  3. class VIP(Enum):
  4.  
  5.     YELLOW = 1
  6.  
  7.     GREEN = 2
  8.  
  9.     BLACK = 3
  10.  
  11.     RED = 4
  12.  
  13. class VIP1(Enum):
  14.  
  15.     YELLOW = 1
  16.  
  17.     GREEN = 2
  18.  
  19.     BLACK = 3
  20.  
  21.     RED = 4
  22.  
  23. print(VIP.GREEN ==VIP1.GREEN)
  24.  
  25. #False

四.枚举注意事项

1.枚举的数值可以相同,在这种情况下,将第二种枚举类型看成别名。遍历时不会打印别名:

  1. class VIP(Enum):
  2.  
  3. YELLOW = 1
  4.  
  5. GREEN = 1 #别名,不会报错
  6.  
  7. BLACK = 3
  8.  
  9. RED = 4
  10.  
  11. print(VIP.GREEN)
  12.  
  13. #VIP.YELLOW

2.把别名加入遍历循环:

  1. (1)
  2. for v in VIP.__members__.items() :
  3.  
  4.     print(v)
  5.  
  6. #('YELLOW', <VIP.YELLOW: 1>)
  7.  
  8. #('GREEN', <VIP.GREEN: 1>)
  9.  
  10. #('BLACK', <VIP.BLACK: 3>)
  11.  
  12. #('RED', <VIP.RED: 4>)
  13.  
  14. (2)
  15.  
  16. 或者遍历__members__:
  17.  
  18. for v in VIP.__members__:
  19.  
  20.     print(v)
  21.  
  22. #YELLOW
  23.  
  24. #GREEN
  25.  
  26. #BLACK
  27.  
  28. #RED

五.枚举转换

1.在数据库里一般存储数值或者标签名字来代表枚举类型,推荐存储数值,数字占用的空间更小。但是不建议在代码种用数值代表枚举,可读性不强。

2.如何将数字转换成枚举类型:

  1. from enum import Enum
  2.  
  3. a = 1
  4.  
  5. class VIP(Enum):
  6.  
  7. YELLOW = 1
  8.  
  9. GREEN = 2
  10.  
  11. BLACK = 3
  12.  
  13. RED = 4
  14.  
  15. print(VIP(a)) #转换枚举类型
  16.  
  17. #VIP.YELLOW

六.枚举小结

1.要求每个枚举类型都是数字的时候继承IntEnum:

  1. from enum import IntEnum
  2.  
  3. class VIP(IntEnum):
  4.  
  5. YELLOW = 1
  6.  
  7. GREEN = 2
  8.  
  9. BLACK = 3
  10.  
  11. RED = 4

2.限制不同的枚举类型不能取相同的值:

  1. from enum import Enum
  2.  
  3. from enum import IntEnum,unique
  4.  
  5. @unique    #装饰器
  6.  
  7. class VIP(IntEnum):
  8.  
  9.     YELLOW = 1
  10.  
  11.     GREEN = 2
  12.  
  13.     BLACK = 3
  14.  
  15.     RED = 4

枚举类型不能实例化,属于单例模式

Python3(八) 枚举详解的更多相关文章

  1. Mac OS X10.9安装的Python2.7升级Python3.4步骤详解

    Mac OS X10.9安装的Python2.7升级Python3.4步骤详解 Mac OS X10.9默认带了Python2.7,不过现在Python3.4.0出来了,如果想使用最新版本,赶紧升级下 ...

  2. python3 常用模块详解

    这里是python3的一些常用模块的用法详解,大家可以在这里找到它们. Python3 循环语句 python中模块sys与os的一些常用方法 Python3字符串 详解 Python3之时间模块详述 ...

  3. Linux学习-linux系统下python升级到python3.6步骤详解,以及遇到的问题解决

    说明:一般linux会自带pyhton2.7 1.首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: wget http://www.python.org/ftp/python/ ...

  4. 枚举详解之EnumSet、EnumMap用法

    枚举简单例子 /** * @author shuliangzhao * @Title: Color * @ProjectName design-parent * @Description: TODO ...

  5. python3多线程趣味详解

    python3的多线程很多人无法理解是怎么运行的,因此本文从程序猿的日常生活出发,写了一个由浅入深的多线程教程,这样子大家就不会觉得陌生了,多线程真的很简单很简单! 不要讲多线程局限于库或者框架,自己 ...

  6. C# 控件双缓冲控制 ControlStyles 枚举详解

    ControlStyles 枚举 .NET Framework 4    指定控件的样式和行为. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合. 命名空间:  Sy ...

  7. Mac OS X10.9安装的Python2.7升级Python3.3步骤详解

    Mac OS X10.9默认带了Python2.7,不过现在Python3.3.3出来了,如果想使用最新版本,赶紧升级下吧.基本步骤如下 第1步:官网下载Python3.3 这里面有windows和m ...

  8. Java 枚举详解

    为什么要用枚举 在博客系统中,一篇文章有且可能有这几种状态, 数据库中article文章表中state字段存储数值,表示其状态: 0(已发表Published) 1(草稿Draft) 2(撤回撤回(D ...

  9. Java基础——枚举详解

    前言: 在第一次学习面向对象编程时,我记得最深的一句话就是“万物皆对象”.于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法……我一直在想,这TM是个什么 ...

随机推荐

  1. 继承Exception⭐⭐

    public class ECOrderException : Exception { //第一种类型: throw new ECOrderException { ErrorCode = " ...

  2. eclipse反编译插件 jadclipse jad

    eclipse常用反编译插件jadclipse.jad 1.下载jadclipse:net.sf.jadclipse_3.3.0.jar,放到eclipse-plugins 2.下载jad.exe,放 ...

  3. crawler碎碎念4 关于python requests、Beautiful Soup库、SQLlite的基本操作

    Requests import requests from PIL import Image from io improt BytesTO import jason url = "..... ...

  4. (分块暴力)Time to Raid Cowavans CodeForces - 103D

    题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些 ...

  5. react元素获取e时,点击target为空的现象

    今天呢,学习react过程中,我要获取一个元素的e, checkAll=(e)=>{ console.log(e) console.log(e.target) } render() { retu ...

  6. Firebase REST API

    use firebase and firesharp to do a Library management system . look github.com/ziyasal/FireSharp

  7. if循环后打印数据竖行输出和横排输出

    代码A如下: def func(*kargs):     return kargs, l = func(5,3,4,5,6) for i in l:          print (i) 打印结果: ...

  8. 关于Queries_per_sec 性能计数器

    [问题描述] Queries_per_sec (QPS)是数据库两个比较重要的性能计数器指标.我们经常要求开发告知这个参数,以评估数据库的一个负载情况.下面的这段代码连上服务器,做一个简单的查询: u ...

  9. LeetCode刷题总结-链表

    LeetCode刷题总结-链表 一.链表     链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的 ...

  10. redis缓存数据库及Python操作redis

    缓存数据库介绍  NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站, 特 ...