enum模块提供了枚举类型的支持。枚举类型是由一个名称和一个统一值来组成。值是常量的值。它们之间能够通过名称进行比較和引用,还能够迭代訪问。
5.9.1 模块内容
本模块主要定义了两种枚举类型:Enum和IntEnum。定义了一个装饰器函数unique(),以便保证全部枚举常量的唯一性。
class enum.Enum
构造枚举常量的基类。
样例:
#python 3.4
import enum
class Color(enum.Enum):
red = 1
green = 2
blue = 3
print(Color.red, repr(Color.red))
print(Color.green)
print(Color.blue)
结果输出例如以下:
Color.red <Color.red: 1>
Color.green
Color.blue
class enum.IntEnum
构造以整数值为枚举值的基类。本类里的枚举值能够与整数相比較,普通的枚举类是不能与整数相比較的。
此类主要用为了旧的代码兼容。或者大大地提高了便利性的场合,否则还是使用普通的枚举类会比較好,由于它不与普通类型相互发生作用,避免了一些编程上失误。
样例:
#python 3.4
import enum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
print(Color.red, repr(Color.red))
print(Color.green)
print(Color.blue)
print(Color.red == 1)
结果输出例如以下:
Color.red <Color.red: 1>
Color.green
Color.blue
True
enum.unique()
本装饰器函数保证了每一个名称仅仅能绑定一个值,达到枚举值的唯一性。
样例:
#python 3.4
import enum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
red = 5
print(Color.red, repr(Color.red))
print(Color.green)
print(Color.blue)
结果输出例如以下:
Traceback (most recent call last):
File "F:/temp/pywin/enum1.py", line 4, in <module>
class Color(enum.IntEnum):
File "F:/temp/pywin/enum1.py", line 8, in Color
red = 5
File "C:Python34libenum.py", line 66, in __setitem__
raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'red'
枚举常量能够迭代遍历:
样例:
#python 3.4
import enum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
for i in Color:
print(i)
结果输出例如以下:
Color.red
Color.green
Color.blue
枚举常量訪问方式:
样例:
#python 3.4
import enum
class Color(enum.IntEnum):
red = 1
green = 2
blue = 3
print(Color(2))
print(Color['red'])
red = Color.red
print(red.name, red.value)
结果输出例如以下:
Color.green
Color.red
red 1
在这里提供三种訪问方式:Color(2), Color[‘red’], red.value。
通过函数API方式创建枚举常量:
样例:
#python 3.4
import enum
Animal = enum.Enum('Animal', 'ant bee cat dog')
print(Animal)
print(list(Animal))
结果输出例如以下:
<enum 'Animal'>
[<Animal.ant: 1>, <Animal.bee: 2>, <Animal.cat: 3>, <Animal.dog: 4>]
避免每一个枚举常量都须要指定值:
样例:
#python 3.4
import enum
class AutoNumber(enum.Enum):
def __new__(cls):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
class Color(AutoNumber):
red = ()
green = ()
blue = ()
for i in Color:
print(repr(i))
结果输出例如以下:
<Color.red: 1>
<Color.green: 2>
<Color.blue: 3>
蔡军生 QQ:9073204 深圳