Python枚举的定义及使用

简介:python的枚举的定义,枚举类与普通类的区别

1. 枚举模块的导入

python的枚举是一个特殊的数据类型,因为python中的枚举实际上就是一个特殊的类,并且它不是python内置的对象。

在使用枚举之前必须导入,导入方式如下:

# 导入枚举类
from enum import Enum

注意:枚举模块是在 enum 包里面

2. 自定义枚举

我们只需要继承 Enum 类即可自定义一个枚举类,具体代码如下:

from enum import Enum

# 通过继承Enum的方式自定义用户等级枚举
class VIP(Enum):
    YELLOW = 1 #黄钻
    GREEN = 2  # 绿钻

枚举是一个标签不能重复的(也就是定义枚举KEY不能重复),并且定义好之后的枚举 不能被外部程序修改 的类。这也是枚举与普通类的区别,如果我们去修改枚举值会直接报错,例如下方代码:

from enum import Enum
class VIP(Enum):
  YELLOW = 1 # 黄钻
  GREEN = 2 # 绿钻

VIP.YELLOW = 3

报错信息:can't set attribute,意思是不能修改属性

如果我们需要定义一个枚举值只能是整数时,我们可以导入 IntEnum 模块,自定义枚举时继承 IntEnum 模块。具体代码如下:

from enum import IntEnum

# 通过继承Enum的方式自定义用户等级枚举
class VIP(IntEnum):
    YELLOW = 1 #黄钻
    GREEN = 2  # 绿钻

继承 IntEnum 后,自定义的枚举YELLOW及GREEN的值只能是整数值,否则会直接报错。

上面我们已经说过,枚举是一个不重复标签的类,但是枚举的是可以相同的。如果我们想要规定某个枚举的值不能重复,我们又该如何定义呢?python提供了一个装饰器 unique 来规定枚举的值不能相同,否则直接报错

from enum import Enum,unique

# 通过添加装饰器unique,规定枚举的值不能重复
@unique
class VIP(Enum):
    YELLOW = 1 #黄钻
    GREEN = 2  # 绿钻
    BLACK = 2 #黑钻

报错信息:duplicate values found in <enum 'VIP'>: BLACK -> GREEN

3. 使用枚举

在我们自己的代码中我们只需要引入自定义的枚举,就可以像使用普通类一样使用枚举。例如下方代码:

# 导入自定义枚举
import VIP

# 获取自定义枚举的值
print(VIP.GREEN.value) # 打印结果:2

# 获取自定义枚举的标签
print(VIP.GREEN.name) # 打印结果:GREEN

除了像上面那样获取枚举值之外,我们还可以遍历枚举:

# 导入自定义枚举
import VIP

for v in VIP:
    print(v.value) #打印的是枚举的值

注意:遍历时不能直接使用 v ,遍历的v是一个具体定义的枚举,例如:VIP.GREEN

也不要直接使用 VIP.GREEN,它获取的是具体定义的枚举,大家可以打印一下看看具体值

如何判断一个具体的值是否存在枚举中呢?对于这个问题,我们可以通过类型转换来判断这个值是否存在枚举中。如果变量a的值不在枚举中会直接报错,因此我们可以通过捕获异常的方式来判断某个值是否存在,具体捕获方式如下:

# 导入自定义枚举
import VIP

a = 4

try:
  VIP(a)
  print('值存在')
except Exception:
  print('值不存在')

没有捕获时报错信息:4 is not a valid VIP

根据上面的特性,我们可以将判断的方法封装到枚举类中,我这里以静态方式封装:

from enum import Enum,unique

@unique
class VIP(Enum):
  YELLOW = 1 # 黄钻
  GREEN = 2 # 绿钻
  WHITE = 3 # 黑钻

  @staticmethod
  def isExits(value):
    try:
      VIP(value)
      return True
    except:
      return False

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1