为什么需要枚举?枚举是用来定义常量的。枚举元素具有不可变的特性,可以用来充当常量。
枚举是与唯一常量值绑定的一系列符号名称(成员)的集合。枚举中的元素可以进行恒等比较,并且枚举本身可迭代。
例如,对于圆周率,我们在 Python 中简单定义 PI = 3.14
,但 PI
是变量,是可以被修改的,故更严格地定义常量需要用到枚举。本文是对 Python 内置枚举模块 enum 的讲解。
注解:枚举成员名称的大小写
因为枚举是用来表示常量的,因此,枚举成员名称建议使用大写字母,本文的示例将采用此种风格。
enum
模块定义了四个枚举类,用来定义名称与值的唯一组合:Enum
、IntEnum
、Flag
和IntFlag
。此外,还定义了一个装饰器 unique()
和一个辅助类 auto
。
class enum.Enum
:创建枚举常量的基类。class enum.IntEnum
:创建 int
子类枚举常量的基类。class enum.Flag
:创建可与位运算符搭配使用,而又不失去 Flag
成员资格的枚举常量的基类。class enum.IntFlag
:创建可与位运算符搭配使用,而又不失去 IntFlag
成员资格的枚举常量的基类。enum.unique()
:Enum
类的装饰器,确保一个名称只绑定一个值。class enum.auto
:用合适的值代替 Enum
成员的实例。初始默认值从 1
开始。枚举是用 class
语法创建的,这种方式易读、易写。利用子类 Enum
定义枚举方法如下:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
注解:
Enum
成员值
成员值可以是int
、str
等。若无需设定确切值,auto
实例可以自动为成员分配合适的值。将auto
和其它值混用需慎重。
注解:命名法
- 类
Color
是枚举(Enum
)。Color.RED
、Color.GREEN
等属性是枚举成员(Enum
成员),也是常量。- 枚举成员具有名称和值(例如
Color.RED
的名称为RED
,Color.BLUE
的值为3等等)。
注解:虽然
Enum
由class
语法创建,但Enum
并不是常规的 Python 类。
可通过名索引访问:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
>>> Color['BLUE']
<Color.BLUE: 3>
可通过值索引访问:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> Color(1)
<Color.RED: 1>
>>> Color(2)
<Color.GREEN: 2>
>>> Color(3)
<Color.BLUE: 3>
如果你有一个枚举成员,可得到它的 name 和 value:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1
两个枚举成员的名称不能相同:(弹出异常)
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... RED = 2
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'RED
但两个枚举成员的值可以相同:(不会报错)
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 1
...
默认情况下,枚举允许多个枚举成员具有相同的值。如需禁用此行为,可以使用装饰器 @enum.unique
>>> from enum import Enum, unique
>>> @unique
... class Color(Enum):
... RED = 1
... GREEN = 1
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Color'>: GREEN -> RED
enum.auto()
函数可自动为枚举成员分配值:
>>> from enum import Enum, auto
>>> class Color(Enum):
... RED = auto()
... GREEN = auto()
... BLUE = auto()
...
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> for item in Color:
... print(item.name, item.value)
...
RED 1
GREEN 2
BLUE 3
枚举成员间不允许比较大小:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> Color.RED < Color.BLUE
Traceback (most recent call last):
...
TypeError: '<' not supported between instances of 'Color' and 'Color'
与非枚举值的比较总不相等:
>>> from enum import Enum
>>> class Color(Enum):
... RED = 1
... GREEN = 2
... BLUE = 3
...
>>> Color.RED == 1
False
枚举模块 enum 在 Python3.4 版本中首次添加,3.4之前的版本使用需安装:
pip install enum
https://docs.python.org/3/library/enum.html