19 枚举

Posted scopicat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19 枚举相关的知识,希望对你有一定的参考价值。

枚举的概念

枚举也是类

定义枚举需要先导入枚举模块:

from enum import Enum

  

枚举类型的定义

class Color(Enum):
    RED = 1
    YELLOW = 2 # 且它们不是常量!
    GREEN = 3 #必须大写,且各枚举属性的值不能相等


print(Color.RED) #打印结果就是Color.RED 这就是枚举的意义所在

  

枚举与普通的类比有什么优势

枚举类型的属性值是不能更改的。

枚举的相关操作

获取枚举标签(属性)的值:类名.属性名.value

获取枚举标签名(属性名):类名.属性名.name  注意:打印的结果是str型

print(type(Color.RED))
print(type(Color.RED.name))
结果:
<enum ‘Color‘>
<class ‘str‘>

 

枚举的遍历

for c in Color:
    print(c)
结果:
Color.RED
Color.RED
Color.YELLOW
Color.GREEN

  

枚举之间的比较运算

枚举之间的比较不是value的比较,而是对象的比较。

所以可以做等值比较,即 == 或 is 或 is not比较:

# 赋值Color为Color1
print(Color.RED == Color.RED)
print(Color.RED == Color1.RED)
print(Color.RED is Color1.RED)
print(Color.RED is not Color1.RED)
结果:
True
False
False
True

  

枚举转换

一般将枚举标签的值存在数据库而不是枚举标签。

所以当从数据库将value值提出来,要得到枚举的标签:

# a为接收来自数据库的枚举的变量
a = 1 #假设a接收到的值为1
#转换为枚举标签 : 枚举类名(a)
如上面的:
print(Color(1))
结果为:
Color.RED

  

枚举需要注意的事情

1.枚举不能有两个相同名的标签

2.两个不同的标签的value不能相同,如果相同,则表示一个是另一个的别名,且普通遍历时不会将别名打印出来(若想遍历出来,使用.__member__属性)

 

IntEnum

Enum类下的枚举标签的值,可以是数值型,也可以是字符串类型。

但当想要其类型仅为数值型时,使用IntEnum就行了。

from enum import IntEnum

  

@unique

当你不想个标签起别名(不同的标签名相同的value)

导入unique,然后声明类时在类上面加上@unique即可,此时如果起别名会报错:

from enum import unique

@unique
class B(Enum):
    AA = 1
    BB = 1

报错结果:
ValueError: duplicate values found in <enum ‘B‘>: BB -> AA

  

 

以上是关于19 枚举的主要内容,如果未能解决你的问题,请参考以下文章

Java中枚举的写法和用法

Cg入门19:Fragment shader - 片段级模型动态变色

Python代码阅读(第19篇):合并多个字典

PAT1049-----枚举法,找规律题,注意降低时间复杂度

android.view.InflateException:二进制 XML 文件第 15 行:二进制 XML 文件第 19 行:膨胀类片段时出错

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段