python的enum枚举数据类型的实现

    枚举类型最大的优点直观, 省事.  举个常用的例子,你要表示星期1-7,你可以用int1-7,但是当你把它作为参数的时候,有时后你就给考虑传入0,8的情况.而且用数字表示还需要相应的注释和文档.

这个时候你定义个一个枚举CreateDate,名字就叫字面就叫Monday , Tuesday ,….就行,直观,并且值可控.


文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,请到原文地址查看更新. 

http://xiaorui.cc/2016/01/05/python%E7%9A%84enum%E6%9E%9A%E4%B8%BE%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%AE%9E%E7%8E%B0/


当然更多人还是喜欢直接用常量。

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。


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注