一般的定义常量:
>>> JAN = 1
>>> FEB = 2
>>> MAR = 3
>>> DEC = 12
>>> print(JAN)
1
复制代码
这样写的好处是简单,但缺点是 int 类型,并且仍然是变量
使用枚举来定义常量:
>>> from enum import Enum
>>> Month = Enum('Month',('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'))
>>> print(Month.Jan)
Month.Jan
>>> for name, member in Month.__members__.items():
... print(name,'=>', member, ',', member.value)
...
Jan => Month.Jan , 1
Feb => Month.Feb , 2
Mar => Month.Mar , 3
Apr => Month.Apr , 4
May => Month.May , 5
Jun => Month.Jun , 6
Jul => Month.Jul , 7
Aug => Month.Aug , 8
Sep => Month.Sep , 9
Oct => Month.Oct , 10
Nov => Month.Nov , 11
Dec => Month.Dec , 12
复制代码
value 属性是自动赋给成员的 int 常量,默认是从1开始计数
精确的控制枚举类型,可以通过 Enum 派生出自定义类:
>>> from enum import Enum, unique
>>> @unique
... class Weekday(Enum):
... Sun = 0
... Mon = 1
... Tue = 2
... Wed = 3
... Thu = 4
... Fri = 5
... Sat = 6
...
>>> day1 = Weekday.Mon
>>> print(day1)
Weekday.Mon
>>> print(Weekday.Tue)
Weekday.Tue
>>> print(Weekday['Tue'])
Weekday.Tue
>>> print(Weekday.Tue.value)
2
>>> print(day1 == Weekday.Mon)
True
>>> print(day1 ==Weekday.Tue)
False
>>> print(Weekday(1))
Weekday.Mon
>>> print(day1 == Weekday(1))
True
>>> Weekday(7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
ValueError: 7 is not a valid Weekday
>>> for name, member in Weekday.__members__.items():
... print(name, '==>', member)
...
Sun ==> Weekday.Sun
Mon ==> Weekday.Mon
Tue ==> Weekday.Tue
Wed ==> Weekday.Wed
Thu ==> Weekday.Thu
Fri ==> Weekday.Fri
Sat ==> Weekday.Sat
>>> for name, member in Weekday.__members__.items():
... print(name, '==>',member, ',', member.value)
...
Sun ==> Weekday.Sun , 0
Mon ==> Weekday.Mon , 1
Tue ==> Weekday.Tue , 2
Wed ==> Weekday.Wed , 3
Thu ==> Weekday.Thu , 4
Fri ==> Weekday.Fri , 5
Sat ==> Weekday.Sat , 6
>>>
复制代码
总结:
1、使用枚举类型定义一个class 类型,使得每个常量都是class类型的唯一的实例
2、访问枚举类有多种方法
3、value 是成员的 int 常量,默认从 1 开始计数
复制代码