Python 中的 Enum 枚举

发布于 2021-04-01 12:39:23 字数 1890 浏览 1321 评论 0

Enum(枚举)在很多应用场景中都会出现,因此绝大部分编程语言都实现了 Enum 类型,Python 也不列外,但列外的是 Enum 在 Python 3.4 中才被正式支持,我们先来看看 Python3 中的 Enum 是怎么使用的。

枚举的创建方式很简单,就像创建一个类一样,只需继承 Enum:

>>> from enum import Enum
>>> class Role(Enum):
...     admin = 1
...     manager = 2
...     guest = 3

它的语法和定义 class 完全是一样的,但它并不是一个真正的 Class。这里的 Role 是 Enum 类型,里面的成员 adminmanager 都是它的实例对象,它们的类型是 Role 类型的:

>>> type(Role)
<class 'enum.EnumMeta'>
>>> type(Role.admin)
<enum 'Role'>
>>>

枚举的每一个实例对象都有自己的名字和值:

>>> Role.admin.name
'admin'
>>> Role.admin.value
1

枚举内部更像是一个OrderedDict:

Role.__members__
mappingproxy(OrderedDict([('admin', <Role.admin: 1>), ('manager', <Role.manager: 2>), ('guest', <Role.guest: 3>)]))
>>>

Python2.x:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'liuzhijun'

def enum(name, *sequential, **named):
    values = dict(zip(sequential, range(len(sequential))), **named)
    values['values'] = values.values()
    # NOTE: Yes, we *really* want to cast using str() here.
    # On Python 2 type() requires a byte string (which is str() on Python 2).
    # On Python 3 it does not matter, so we'll use str(), which acts as
    # a no-op.
    # return type(str(name), (), values)
    import collections
    aa = collections.namedtuple(str(name), values.keys())
    return aa(**values)


JobStatus = enum(
    'JobStatus',
    QUEUED='queued',
    FINISHED='finished',
    FAILED='failed',
    STARTED='started',
    DEFERRED='deferred'
)

print JobStatus.QUEUED
print JobStatus.FAILED
print JobStatus.STARTED
print JobStatus._fields
print JobStatus.values

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文