您的位置:首页 > 其它

5.9 enum--支持枚举类型

2016-02-20 15:21 295 查看
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:\Python34\lib\enum.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 深圳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: