Python知识点记录五(枚举类)
枚举类
对于一组特定含义的各异常量的集合,在编程中可以通过“枚举”的方式实现,在Python3中也引入了这一概念,并且通过枚举类进行了实现。
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4
需要注意的是,对于枚举类而言,与一般的类不同,它不能实例化,某一个枚举类本身就是一个单例的实现。
枚举类可以通过“枚举类名.属性名”的方式访问枚举项,注意这里的枚举项本身是一个枚举类型,如果要访问其对应的名称、值,需要分别通过“枚举类名.属性名.name”和“枚举类名.属性名.value”:
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 print(VIP.GREEN) #打印GREEN这个枚举项 print(VIP.GREEN.name) #打印GREEN这个枚举项的属性名 print(VIP.GREEN.value) #打印GREEN这个枚举项的值 ''' 输出: VIP.GREEN GREEN 2 '''
枚举类同样可以通过for/in遍历:
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 for v in VIP: print(v, end = '--') print('%s, %d' %(v.name, v.value)) ''' VIP.YELLOW--YELLOW, 1 VIP.GREEN--GREEN, 2 VIP.BLACK--BLACK, 3 VIP.RED--RED, 4 '''
在“枚举”这一概念中,枚举的“含义”(对应于上述代码的属性,如YELLOW,GREEN等)不能相同,其对应的值也不能相等。
在Python3通过枚举类对“枚举”的实现中,同样不能有相同的含义(即枚举类不能有相同的属性名),如果代码中包含了相同的属性名,则会报错;而对于不同的含义(属性名),则是可以有相同的值的,Python不会报错。
from enum import Enum class VIP(Enum): YELLOW = 1 YELLOW = 2 #程序报错,不能同名 BLACK = 3 RED = 4
from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 1 #程序不会报错
BLACK = 3
RED = 4
print(VIP.GREEN)
for v in VIP:
print(v)
'''
输出:
VIP.YELLOW
VIP.YELLOW
VIP.BLACK
VIP.RED
'''
虽然给不同的属性名设置相同的值不会报错,但在上例代码我们可以发现,对VIP这个枚举类来说,GREEN这个枚举项并不存在(无法遍历访问到),甚至直接通过VIP.GREEN访问得到的也是VIP.YELLOW这个项。这是因为在PYTHON的设计中,对于拥有相同值的项,都会被默认为等同于第一个设置该值的项,其余项为该项的别名。
如果要访问代码设计中的所有项,可以通过VIP.__members__访问:
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 1 #程序不会报错 BLACK = 3 RED = 4 for v in VIP.__members__: print(v) ''' 输出: YELLOW GREEN BLACK RED '''
对于一个已实现的枚举类而言,其本身就是一个常量,那么一个应用场景是,如果有某个变量,需要判断它是否对应于这个枚举类的某一项,该如何操作?
比如对于周一到周日,如果某个为1-7之间的变量,需要判断它是否能匹配于星期几这个枚举类,通常可以想到通过if来判断:
from enum import Enum class WEEKDAY(Enum): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 3 THURSDAY = 4 FRIDAY = 5 SATURDAY = 6 SUNDAY = 7 a = 6 for v in WEEKDAY: if a == v.value: print(v.name) break
但PYTHON中提供了一种更方便的途径:枚举类名(变量),前提是这个变量值必须在枚举类各项的值范围内,否则会报错:
from enum import Enum class WEEKDAY(Enum): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 3 THURSDAY = 4 FRIDAY = 5 SATURDAY = 6 SUNDAY = 7 a = 6 print(WEEKDAY(a)) #输出WEEKDAY.SATURDAY