枚举类

176 阅读1分钟

一般的定义常量:

>>> 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 开始计数