# Python: Enum枚举的实现

http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html

从C系语言过来用Python，好不容易适应了写代码不打花括号，突然有一天发现它居然木有枚举……于是stackoverflow了一把，发现神人的枚举（enum）实现到处都是，于是汉化总结过来。

1 2

from enum import Enum Animal = Enum('Animal', 'ant bee cat dog')

or

1 2 3 4 5

class Animals(Enum):     ant = 1     bee = 2     cat = 3     dog = 4

1 2 3 4 5

def enum(**enums):     return type('Enum', (), enums)   Numbers = enum(ONE=1, TWO=2, THREE='three') # Numbers.ONE == 1, Numbers.TWO == 2 and Numbers.THREE == 'three'

1 2 3 4 5 6

def enum(*sequential, **named):     enums = dict(zip(sequential, range(len(sequential))), **named)     return type('Enum', (), enums)   Numbers = enum('ZERO', 'ONE', 'TWO') # Numbers.ZERO == 0 and Numbers.ONE == 1

1 2 3 4 5 6 7

def enum(*sequential, **named):     enums = dict(zip(sequential, range(len(sequential))), **named)     reverse = dict((value, key) for key, value in enums.iteritems())     enums['reverse_mapping'] = reverse     return type('Enum', (), enums)   # Numbers.reverse_mapping['three'] == 'THREE'

1 2 3 4 5 6 7 8

class Enum(set):     def __getattr__(self, name):         if name in self:             return name         raise AttributeError   Animals = Enum(["DOG", "CAT", "HORSE"]) print Animals.DOG

1 2 3 4 5 6 7

dog, cat, rabbit = range(3)   # or   class Stationary:     (Pen, Pencil, Eraser) = range(0, 3) print Stationary.Pen

1 2 3 4

class Enum(tuple): __getattr__ = tuple.index   State = Enum(['Unclaimed', 'Claimed']) print State.Claimed

1 2 3 4 5 6 7 8 9 10 11 12 13 14

from collections import namedtuple   def enum(*keys):     return namedtuple('Enum', keys)(*keys)   MyEnum = enum('FOO', 'BAR', 'BAZ')   # 带字符数字映射的，像C/C++ def enum(*keys):     return namedtuple('Enum', keys)(*range(len(keys)))   # 带字典映射的，可以映射出各种类型，不局限于数字 def enum(**kwargs):     return namedtuple('Enum', kwargs.keys())(*kwargs.values())

851 篇文章41 人订阅

0 条评论

## 相关文章

### PICE（5）：MongoDBStreaming - gRPC -MGO Service

我在前面提到过MongoDB不支持像SQL般字符式的操作指令，所以我们必须对所有的MongoDB操作指令建立protobuf类型才能支持MongoDB指令的...

16240

37950

### JavaScript对象创建的九种方式

1、标准创建对象模式 1 var person = new Object(); 2 person.name = "Nicholas"; 3 person.age...

30970

### javascript实现数字转大写金额的函数

<SCRIPT type="text/javascript" Charset="GB2312"> function convertCurrency(curre...

25690

21970

### Javascript的原型继承，说清楚

一直以来对Javascript的原型、原型链、继承等东西都只是会用和了解，但没有深入去理解这门语言关于继承这方面的本质和特点。闲暇之余做的理解和总...

18890

### Spark Tips 1: RDD的collect action 不适用于单个element size过大的情况

collect是Spark RDD一个非常易用的action，通过collect可以轻易获得一个RDD当中所有的elements。当这些elements是Str...

36990

28770

20610

9130