Python中枚举的常见做法是什么?
我该如何在Python中实现一个枚举类型(在某些语言中拼写为enum
)?通常大家是怎么做到的呢?
4 个回答
9
我也不知道为什么Python不直接支持枚举(Enums)。我找到的最好的方法是重写 _str_ 和 _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
21
我见过这个模式好几次:
>>> 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
如果你想要更强大的功能(比如稀疏值、特定枚举的异常等等),可以试试这个方法。
374
更新:适用于 Python 3.4 及以上版本:
class Materials:
Shaded, Shiny, Transparent, Matte = range(4)
>>> print Materials.Matte
3
从 Python 3.4 版本开始,你可以使用 Enum
(如果是整数值的枚举,可以用 IntEnum
)来自 enum 模块。你可以使用 enum.auto
来自动增加这些值:
import enum
class Materials(enum.IntEnum):
Shaded = 1
Shiny = enum.auto()
Transparent = 3
Matte = enum.auto()
print(Materials.Shiny == 2) # True
print(Materials.Matte == 4) # True