#出处:http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html""" 从C系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来。 如果是新版Python用户(Python 3.4 with PEP 435):"""#py3.x版本如下# from enum import Enum# enum1=Enum(‘a1‘,‘a3‘)#或者# class Enum1(Enum):# a=1# b=2# c=3# d=4#以上例子是python3.x版本的才可以使用,而python2.x版的朋友,使用如下方式def enum(**e): return type(‘Enum‘,(),e)num=enum(num1=1,num2=2,num3=3)print num.mro()print num.__dict__ #复杂的def e1(*a,**k): e2=dict(zip(a,range(len(a))),**k) return type(‘Enum‘,(),e2)Numbers = e1(‘ZERO‘, ‘ONE‘, ‘TWO‘)print Numbers() #有带值到名称映射的def e2(*a,**k): e1=dict(zip(a,range(len(a))),**k) reverse=dict((v,k)for k ,v in e1.iteritems()) e1[‘reverse_mapping‘]=reverse return type(‘Enum‘,(),e1) #有用set实现的class E1(set): def __getattr__(self, name): if name in self: return name raise AttributeErrorAnimals = E1(["DOG", "CAT", "HORSE"])print Animals.DOG#有用range实现的a,b,c=range(3)#orclass Abc: (a,b,c)=range(3) print Abc.b#有用tuple实现的class Ty(tuple): __getattr__=tuple.index Ty=Ty([‘dog‘,‘cat‘])print Ty.cat#有用namedtuple实现的from collections import namedtupledef a(*k): return namedtuple(‘emnu‘,k)(*k)MyEnum = a(‘FOO‘, ‘BAR‘, ‘BAZ‘)# 带字符数字映射的,像C/C++def a(*k): return namedtuple(‘enum‘,k)(*range(len(k)))# 带字典映射的,可以映射出各种类型,不局限于数字def d(**k): return namedtuple(‘enum‘,k.keys())(*k.values())
时间: 2024-11-15 00:34:04