我主要是一个C#开发人员,但是我目前正在做一个Python语言的项目。
如何在Python中表示Enum的等价物?
发布于 2012-01-18 14:09:19
我真的很喜欢Alec Thomas的解决方案(http://stackoverflow.com/a/1695250):
def enum(**enums):
'''simple constant "enums"'''
return type('Enum', (object,), enums)它看起来优雅整洁,但它只是一个用来创建具有指定属性的类的函数。
对函数稍作修改,我们就可以让它表现得更“枚举”一些:
注意:我创建了以下示例,试图重现pygtk的新样式“枚举”(如Gtk.MessageType.WARNING)的行为。
def enum_base(t, **enums):
'''enums with a base class'''
T = type('Enum', (t,), {})
for key,val in enums.items():
setattr(T, key, T(val))
return T这将基于指定的类型创建枚举。除了像前面的函数一样提供属性访问之外,它的行为与您期望的Enum对于类型的行为相同。它还继承基类。
例如,整数枚举:
>>> Numbers = enum_base(int, ONE=1, TWO=2, THREE=3)
>>> Numbers.ONE
1
>>> x = Numbers.TWO
>>> 10 + x
12
>>> type(Numbers)
<type 'type'>
>>> type(Numbers.ONE)
<class 'Enum'>
>>> isinstance(x, Numbers)
True使用此方法可以做的另一件有趣的事情是通过覆盖内置方法来定制特定的行为:
def enum_repr(t, **enums):
'''enums with a base class and repr() output'''
class Enum(t):
def __repr__(self):
return '<enum {0} of type Enum({1})>'.format(self._name, t.__name__)
for key,val in enums.items():
i = Enum(val)
i._name = key
setattr(Enum, key, i)
return Enum
>>> Numbers = enum_repr(int, ONE=1, TWO=2, THREE=3)
>>> repr(Numbers.ONE)
'<enum ONE of type Enum(int)>'
>>> str(Numbers.ONE)
'1'https://stackoverflow.com/questions/36932
复制相似问题