What's the common practice for enums in Python?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
How can I represent an 'enum' in Python?
在Python中,枚举的常见做法是什么?也就是说,它们是如何在Python中复制的?
1 2 3 4 5 6 7 | public enum Materials { Shaded, Shiny, Transparent, Matte } |
1 2 3 4 5 | class Materials: Shaded, Shiny, Transparent, Matte = range(4) >>> print Materials.Matte 3 |
我见过这种模式好几次了:
1 2 3 4 5 6 7 8 | >>> 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 |
您也可以使用类成员,尽管您必须提供自己的编号:
1 2 3 4 5 6 7 | >>> class Foo(object): bar = 0 baz = 1 quux = 2 >>> Foo.quux 2 |
如果您正在寻找更健壮的东西(稀疏值、特定于枚举的异常等),请尝试这个方法。
我不知道为什么Python本身不支持枚举。我发现模仿它们的最佳方法是重写str_uu和uueq_uu,这样你就可以比较它们,当你使用print()时,你得到的是字符串而不是数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
用途:
1 2 3 4 5 | >>> s = enumSeason(enumSeason.Spring) >>> print(s) Spring |
你可能会使用继承结构,尽管我玩得越多,感觉越脏。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |