您好,欢迎访问一九零五行业门户网

Python中枚举类型的详解(代码示例)

本篇文章给大家带来的内容是关于python中枚举类型的详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
python 的原生类型中并不包含枚举类型。为了提供更好的解决方案,python 通过 pep 435 在 3.4 版本中添加了 enum 标准库。
枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。在没有专门提供枚举类型的时候我们是怎么做呢,一般就通过字典或类来实现:
color = {    'red'  : 1,    'green': 2,    'blue' : 3,}class color:    red   = 1    green = 2    blue  = 3
这种来实现枚举如果小心翼翼地使用当然没什么问题,毕竟是一种妥协的解决方案。它的隐患在于可以被修改。
使用 enum
更好的方式是使用标准库提供的 enum 类型,官方库值得信赖。3.4 之前的版本也可以通过 pip install enum 下载支持的库。简单的示例:
from enum import enumclass color(enum):    red = 1    green = 2    blue = 3
枚举成员有值(默认可重复),枚举成员具有友好的字符串表示:
>>> print(color.red)color.red>>> print(repr(color.red))<color.red: 1>>>> type(color.red)<enum 'color'>>>> isinstance(color.green, color)true
枚举类型不可实例化,不可更改。
定义枚举
定义枚举时,成员名不允许重复
class color(enum):    red = 1    green = 2    red = 3    # typeerror: attempted to reuse key: 'red'
成员值允许相同,第二个成员的名称被视作第一个成员的别名
class color(enum):    red   = 1    green = 2    blue  = 1print(color.red)              # color.redprint(color.blue)             # color.redprint(color.red is color.blue)# trueprint(color(1))               # color.red  在通过值获取枚举成员时,只能获取到第一个成员
若要不能定义相同的成员值,可以通过 unique 装饰
from enum import enum, unique@uniqueclass color(enum):    red   = 1    green = 2    blue  = 1  # valueerror: duplicate values found in <enum 'color'>: blue -> red
枚举取值
可以通过成员名来获取成员也可以通过成员值来获取成员:
print(color['red'])  # color.red  通过成员名来获取成员print(color(1))      # color.red  通过成员值来获取成员
每个成员都有名称属性和值属性:
member = color.redprint(member.name)   # redprint(member.value)  # 1
支持迭代的方式遍历成员,按定义的顺序,如果有值重复的成员,只获取重复的第一个成员:
for color in color:    print(color)
特殊属性 __members__ 是一个将名称映射到成员的有序字典,也可以通过它来完成遍历:
for color in color.__members__.items():    print(color)          # ('red', <color.red: 1>)
枚举比较
枚举的成员可以通过 is 同一性比较或通过 == 等值比较:
color.red is color.redcolor.red is not color.bluecolor.blue == color.redcolor.blue != color.red
枚举成员不能进行大小比较:
color.red < color.blue # typeerror: unorderable types: color() < color()
扩展枚举 intenum
intenum 是 enum 的扩展,不同类型的整数枚举也可以相互比较:
from enum import intenumclass shape(intenum): circle = 1 square = 2class request(intenum): post = 1 get = 2print(shape.circle == 1) # trueprint(shape.circle < 3) # trueprint(shape.circle == request.post) # trueprint(shape.circle >= request.post) # true
总结
enum 模块功能很明确,用法也简单,其实现的方式也值得学习,有机会的话可以看看它的源码。
以上就是python中枚举类型的详解(代码示例)的详细内容。
其它类似信息

推荐信息