枚举类型最大的优点直观, 省事. 举个常用的例子,你要表示星期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。
