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

 

posted @ 2018-06-02 11:52  tsembrace  阅读(273)  评论(0编辑  收藏  举报