当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份:
JAN = 1
FEB = 2
MAR = 3
...
NOV = 11
DEC = 12
好处是简单,缺点是类型是 int
,并且仍然是变量。
更好的方法是为这样的枚举类型定义一个 class
类型,然后,每个常量都是 class
的一个唯一实例。Python 提供了 Enum
类来实现这个功能:
from enum import Enum
Month = Enum('Month',
('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
)
这样我们就获得了 Month
类型的枚举类,可以直接使用 Month.Jan
来引用一个常量:
>>> Month.Jan
<Month.Jan: 1>
>>> Month.Jan.name
'Jan'
>>> Month.Jan.value
1
>>> Month.Feb.value
2
value
属性则是自动赋给成员的 int
常量,默认从 1 开始计数。
当然,也可以自定义 value
属性:
from enum import Enum, unique
@unique
class Month(Enum):
Jan = 0
Feb = 1
Mar = 2
Apr = 3
May = 4
Jun = 5
Jul = 6
Aug = 7
Sep = 8
Oct = 9
Nov = 10
Dec = 11
这里 @unique
装饰器可以帮助我们检查保证没有重复值。
访问这些枚举类型可以有若干种方法:
>>> Month.Jan
<Month.Jan: 0>
>>> Month['Jan']
<Month.Jan: 0>
>>> Month(0)
<Month.Jan: 0>
>>> Month(13)
Traceback (most recent call last):
......
ValueError: 13 is not a valid Month