我一直在使用一个小类来模拟一些Python项目中的Enums。有没有更好的方法,或者这对某些情况最有意义?
这里的类代码:
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)
答案 0 :(得分:5)
之前已经建议将枚举包含在该语言中,但被拒绝(请参阅http://www.python.org/dev/peps/pep-0354/),尽管您可以使用现有的包而不是编写自己的实现:
答案 1 :(得分:4)
最常见的枚举案例是枚举值,它们是State或Strategy设计模式的一部分。枚举是特定状态或要使用的特定可选策略。在这种情况下,它们几乎总是某些类定义的一部分
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 )
答案 2 :(得分:3)
我在顶级模块上下文中经常看到的是:
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
更不明确。
除此之外,另一件冒犯我的Pythonic情感的事情就是你提出的课程是使用split()
。为什么不直接传入元组,列表或其他可枚举的内容?
答案 3 :(得分:3)
有很多很好的讨论here。
答案 4 :(得分:2)
内置的枚举方法是:
(FOO, BAR, BAZ) = range(3)
适用于小型套装,但有一些缺点:
有关python中完整的枚举实现,请参阅: http://code.activestate.com/recipes/67107/
答案 5 :(得分:1)
我开始看起来很像S.Lott的答案,但我只重载'str'和'eq'(而不是整个对象类),所以我可以打印并比较enum的值。
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)将产生名称而不是值,而持有Spring的两个值将相互相等。
>>> x = enumSeason(enumSeason.Spring)
>>> print(x)
Spring
>>> y = enumSeason(enumSeason.Spring)
>>> x == y
True