溫州建設(shè)誠(chéng)信網(wǎng)站seo學(xué)習(xí)論壇
Python中的Enum
Enum(枚舉)在很多應(yīng)用場(chǎng)景中都會(huì)出現(xiàn),因此絕大部分編程語(yǔ)言都實(shí)現(xiàn)了Enum類型,Python也不列外,但列外的是Enum在Python3.4中才被正式支持,我們先來(lái)看看Python3中的Enum是怎么使用的。
枚舉的創(chuàng)建方式很簡(jiǎn)單,就像創(chuàng)建一個(gè)類一樣,只需繼承Enum:
>>> from enum import Enum
>>> class Role(Enum):
... admin = 1
... manager = 2
... guest = 3
它的語(yǔ)法和定義class
完全是一樣的,但它并不是一個(gè)真正的class。這里的Role
是Enum類型,里面的成員admin
,manager
都是它的實(shí)例對(duì)象,它們的類型是Role
類型的:
>>> type(Role)
<class 'enum.EnumMeta'>
>>> type(Role.admin)
<enum 'Role'>
>>>
枚舉的每一個(gè)實(shí)例對(duì)象都有自己的名字和值:
>>> Role.admin.name
'admin'
>>> Role.admin.value
1
枚舉內(nèi)部更像是一個(gè)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 collectionsaa = 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