在 Python 中,枚举是一组唯一的名称,这些名称绑定到唯一且常量的值。
Enums通过继承Enum类来定义。
内置枚举类型位于enum模块中,而Enum类可以通过from enum import Enum导入。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
请注意,enum成员的值可以是任何数据类型,例如str、tuple、float等。
class Color(Enum):
RED = 'red'
GREEN = 'green'
Enums也可以使用函数调用语法来创建。
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
当把相同的值赋给enum中的两个成员时,后赋值的成员会成为前一个成员的别名。不允许为enum的两个不同成员使用相同的名称。
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
可以使用标准的for member in语法遍历枚举的成员:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Enum成员可以使用is(身份运算符)或is not进行比较。==或!=(相等运算符)的作用相同:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
要分配整数值,auto()函数从1开始,并自动设置后续值。
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
要禁止别名(防止不同名称具有重复值),可以使用类装饰器@enum.unique装饰器。
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
要使用给定值访问enum成员,可以使用这样的写法:<EnumName>(<value>)。
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
通过使用任意混入类或数据类型对Enum类进行子类化,可以编写自定义的受限Enum。例如:
class StrEnum(str, Enum):
pass