题
这个问题已经有一个答案在这里:
- 怎么我可以代表一个'Enum'在蟒蛇? 43的答案
我一直在使用一个小类仿效枚举,在一些蟒蛇的项目。是否有更好的办法或不会这样做的最有意义的对于一些情况下?
类代码在这里:
class Enum(object):
'''Simple Enum Class
Example Usage:
>>> codes = Enum('FOO BAR BAZ') # codes.BAZ will be 2 and so on ...'''
def __init__(self, names):
for number, name in enumerate(names.split()):
setattr(self, name, number)
解决方案
还有很多很好的讨论 在这里,.
其他提示
枚举的已提出供列入该语言,但被拒绝(见 http://www.python.org/dev/peps/pep-0354/),虽然有现成的软件包可以使用,而不是写你自己的执行情况:
- 枚举: http://pypi.python.org/pypi/enum
- SymbolType(不太一样枚举,但是仍然有用): http://pypi.python.org/pypi/SymbolType
- 或者只是做一个搜索
最常见的枚举的情况下是所列举的价值观的组成部分的状态或战略的设计图案。在枚举的具体国家或具体可选择的战略来使用。在这种情况下,他们几乎总是一部分的某些类定义
class DoTheNeedful( object ):
ONE_CHOICE = 1
ANOTHER_CHOICE = 2
YET_ANOTHER = 99
def __init__( self, aSelection ):
assert aSelection in ( self.ONE_CHOICE, self.ANOTHER_CHOICE, self.YET_ANOTHER )
self.selection= aSelection
然后,在客户的此类。
dtn = DoTheNeeful( DoTheNeeful.ONE_CHOICE )
什么我看到更多的往往是这样的,顶级模块的情况下:
FOO_BAR = 'FOO_BAR'
FOO_BAZ = 'FOO_BAZ'
FOO_QUX = 'FOO_QUX'
...然后...
if something is FOO_BAR: pass # do something here
elif something is FOO_BAZ: pass # do something else
elif something is FOO_QUX: pass # do something else
else: raise Exception('Invalid value for something')
注意使用 is
而不是 ==
是冒险在这里--它假定,人们使用 your_module.FOO_BAR
而不是弦 'FOO_BAR'
(这将 通常 被拘留这样的, is
将匹配,但这肯定不能依赖),并因此可能不适合根据上下文。
一个优点这样做这种方式是,通过寻找任何地方的一个参考,符串被储存,这是显而易见的,它是从哪里来的; FOO_BAZ
是多少含糊不清比 2
.
除此之外,其他的事情冒犯我的功能已大大增强的感情重新类建议是使用 split()
.为什么不仅仅是通过在一个多元组,列表或其他可枚举的开始?
Builtin的方式做枚举的是:
(FOO, BAR, BAZ) = range(3)
其工作小组,但有一些缺点:
- 你需要计算元件的数目通过手
- 你不能跳过值
- 如果你增添一个名字,你也需要更新的范围内数量
对于一个完整的枚举行python,见:http://code.activestate.com/recipes/67107/
我开始有东西看起来很像S.洛特的答案,但我只载的'str'和'eq'(而不是整个对象类)所以我可以打印和比较枚举的价值。
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
Print(x)将产生的名称,而不是的价值和两个值保持弹簧将等于另一个。
>>> x = enumSeason(enumSeason.Spring)
>>> print(x)
Spring
>>> y = enumSeason(enumSeason.Spring)
>>> x == y
True