7.枚举
在Python3中新增加了一种数据类型—枚举。
枚举的定义:(1)导入enum模块;(2)使用class定义枚举,并继承Enum类;(3)定义枚举成员。
#程序7-1
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 2
YELLOW = 3
BLACK = 4
上述代码中,定义了枚举Color。其中Color表示数据类型,而不是枚举的对象;RED = 0、BLUE = 1等称为枚举成员;RED表示成员名称(因为是常量,因此大写);0表示成员值。
本质上,枚举是一种特殊的类,但是它和普通的类有很多的不同。
1.定义枚举时,其枚举成员的名称不允许相同。
#程序7-2(错误示例)
from enum import Enum
class Color(Enum):
RED = 0
RED = 1
GREEN = 2
YELLOW = 3
BLACK = 4
运行结果:
Traceback (most recent call last):
File ".\run.py", line 5, in
class Color(Enum):
File ".\run.py", line 7, in Color
RED = 1
File "D:\Program Files (x86)\Python\Python37-32\lib\enum.py", line 100, in __setitem__
raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'RED'
在普通类定义中,其类成员的成员是允许相同的。
2.默认情况下,不同的成员值允许相同。但是两个相同值的成员,其第二个成员名称是第一个成员名称的别名;因此在访问枚举成员时,只能获取第一个成员。
#程序7-3
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 1
YELLOW = 3
BLACK = 4
print(Color(1))
运行结果:
Color.BLUE
3.若要限制枚举中成员值都各不相同,则需要使用装饰器unique。
#程序7-4(错误示例)
from enum import Enum,unique
@unique
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 1
YELLOW = 3
BLACK = 4
print(Color(1))
运行结果:
Traceback (most recent call last):
File ".\run.py", line 6, in
class Color(Enum):
File "D:\Program Files (x86)\Python\Python37-32\lib\enum.py", line 848, in unique
(enumeration, alias_details))
ValueError: duplicate values found in
常用的有3种方法。
#程序7-5:方法1
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 2
YELLOW = 3
BLACK = 4
print(Color.RED)
print(Color.RED.name)
print(Color.RED.value)
运行结果:
Color.RED
RED
0
通过Color.RED并不能访问其名称或数值,只能得到枚举成员。
#程序7-6:方法2(不推荐)
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 2
YELLOW = 3
BLACK = 4
print(Color(1))
print(Color['BLUE'])
运行结果:
Color.BLUE
Color.BLUE
通过Color(1)和Color['BLUE']可以获取枚举成员。当我们通过数值来判断枚举成员时,使用Color(1)这样的方式非常的简单,如Color(1) == Color.BLUE。
#程序7-7:方法3
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 1
YELLOW = 3
BLACK = 4
for c in Color:
print(c)
for c in Color.__members__.items():
print(c)
运行结果:
Color.RED
Color.BLUE
Color.YELLOW
Color.BLACK
('RED',
('BLUE',
('GREEN',
('YELLOW',
('BLACK',
使用for循环可以遍历枚举成员。当使用Color.__members__.items()时,可以将枚举成员中相同值的成员也打印出来。
枚举成员之间的比较只能使用比较运算符==和身份运算符is。
#程序7-8
from enum import Enum
class Color(Enum):
RED = 0
BLUE = 1
GREEN = 2
YELLOW = 3
BLACK = 4
print(Color(1))
if Color(1) == Color.BLUE:
print('BLUE = 1')
print(Color(3))
if Color(3) is Color.YELLOW:
print('YELLOW = 3')
运行结果:
Color.BLUE
BLUE = 1
Color.YELLOW
YELLOW = 3
枚举成员只能和枚举成员之间比较,而不能和枚举成员的数值进行比较。