这种模式我见过好几次:

>>> class Enumeration(object):
def __init__(self, names):  # or *names, with no .split()
for number, name in enumerate(names.split()):
setattr(self, name, number)


>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

你也可以只使用类成员,不过你必须提供你自己的编号:

>>> class Foo(object):
bar  = 0
baz  = 1
quux = 2


>>> Foo.quux
2

如果您正在寻找更健壮的东西(稀疏值、特定于枚举的异常等) ,试试这个食谱

我不知道为什么 Enums 不能得到 Python 的本地支持。 我发现模拟它们的最佳方法是重写 _ str _ and _ eq _,这样您就可以比较它们,当您使用 print ()时,您得到的是字符串而不是数值。

class enumSeason():
Spring = 0
Summer = 1
Fall = 2
Winter = 3
def __init__(self, Type):
self.value = Type
def __str__(self):
if self.value == enumSeason.Spring:
return 'Spring'
if self.value == enumSeason.Summer:
return 'Summer'
if self.value == enumSeason.Fall:
return 'Fall'
if self.value == enumSeason.Winter:
return 'Winter'
def __eq__(self,y):
return self.value==y.value

用法:

>>> s = enumSeason(enumSeason.Spring)


>>> print(s)


Spring
class Materials:
Shaded, Shiny, Transparent, Matte = range(4)


>>> print Materials.Matte
3

你可能会使用一个继承结构,虽然我越玩这个我越觉得肮脏。

class AnimalEnum:
@classmethod
def verify(cls, other):
return issubclass(other.__class__, cls)




class Dog(AnimalEnum):
pass


def do_something(thing_that_should_be_an_enum):
if not AnimalEnum.verify(thing_that_should_be_an_enum):
raise OhGodWhy