首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中表示'Enum‘?

如何在Python中表示'Enum‘?
EN

Stack Overflow用户
提问于 2008-08-31 23:55:48
回答 43查看 1.1M关注 0票数 1.1K

我主要是一个C#开发人员,但是我目前正在做一个Python语言的项目。

如何在Python中表示Enum的等价物?

EN

Stack Overflow用户

发布于 2012-01-18 14:09:19

我真的很喜欢Alec Thomas的解决方案(http://stackoverflow.com/a/1695250):

代码语言:javascript
运行
复制
def enum(**enums):
    '''simple constant "enums"'''
    return type('Enum', (object,), enums)

它看起来优雅整洁,但它只是一个用来创建具有指定属性的类的函数。

对函数稍作修改,我们就可以让它表现得更“枚举”一些:

注意:我创建了以下示例,试图重现pygtk的新样式“枚举”(如Gtk.MessageType.WARNING)的行为。

代码语言:javascript
运行
复制
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对于类型的行为相同。它还继承基类。

例如,整数枚举:

代码语言:javascript
运行
复制
>>> 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

使用此方法可以做的另一件有趣的事情是通过覆盖内置方法来定制特定的行为:

代码语言:javascript
运行
复制
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'
票数 10
EN
查看全部 43 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档