枚举类型最大的优点直观, 省事. 举个常用的例子,你要表示星期1-7,你可以用int1-7,但是当你把它作为参数的时候,有时后你就给考虑传入0,8的情况.而且用数字表示还需要相应的注释和文档.
这个时候你定义个一个枚举CreateDate,名字就叫字面就叫Monday , Tuesday ,….就行,直观,并且值可控.
文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,请到原文地址查看更新.
当然更多人还是喜欢直接用常量。
python在3.4版本中已经自带了enum枚举类型,如果你是3.4之前的python版本,那么可以pip install enum34
以前想实现类似枚举的功能是用一个类表示的。
class En(): ant = 1 bee = 2 cat = 3 dog = "mm"
我们来测试下enum34模块带的枚举功能. enum34原始的api有些怪异,如果不对其封装是不怎么好用的.
from enum import Enum Animal = Enum('Animal', 'ant bee cat dog')
我们来封装一下enum,好让我们更舒服的获取索引位置.
#blog: xiaorui.cc from enum import Enum def enum(*sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) return type('Enum', (), enums) Numbers = enum('ZERO', 'ONE', 'TWO') Numbers.ZERO Numbers.ONE
如果想取到具体的值value,那么就封装字典的模式.
#blog: xiaorui.cc from enum import Enum def enum(**enums): return type('Enum', (), enums) Numbers = enum(ONE=1, TWO=2, THREE='three') Numbers.ONE Numbers.THREE 'three'
enum实现起来本身就简单,不需要安装enum34模块。 我们自己来实现enum枚举的功能.
#blog: xiaorui.cc class Enum(object): def __init__(self, kwargs): for key, value in kwargs.iteritems(): self.__dict__[key] = value def __getattr__(self, key): if key in self.__dict__: return self.__dict__[key] raise AttributeError() d = {'a':'xiaorui.cc','b':'rui'} nima = Enum(d) print nima.a
Python enum枚举就说这么多了. 虽然枚举这功能不经常使用,但也不至于在python3.4才集成enum。