在 Python 3.4 和添加出色的enum
模块之前,一个不错的选择是使用namedtuple:
from collections import namedtuple
Item = namedtuple('abitem', ['a', 'b'])
class Items:
GREEN = Item('a', 'b')
BLUE = Item('c', 'd')
现在,任何受支持的 Python 版本都有enum
,所以请使用该模块。它使您可以更好地控制每个枚举值的生成方式。
如果您给每个项目一个值元组,那么这些值将__init__
作为单独的(位置)参数传递给方法,这样您就可以在枚举值上设置其他属性:
from enum import Enum
class Items(Enum):
GREEN = ('a', 'b')
BLUE = ('c', 'd')
def __init__(self, a, b):
self.a = a
self.b = b
这将生成枚举条目,其值是分配给每个名称的元组,以及两个属性a
和b
:
>>> Items.GREEN, Items.BLUE
(<Items.GREEN: ('a', 'b')>, <Items.BLUE: ('c', 'd')>)
>>> Items.BLUE.a
'c'
>>> Items.BLUE.b
'd'
>>> Items(('a', 'b'))
<Items.GREEN: ('a', 'b')>
请注意,您可以通过再次传入相同的元组来查找每个枚举值。
如果第一项应该代表每个枚举条目的值,请使用一种__new__
方法来设置_value_
:
from enum import Enum
class Items(Enum):
GREEN = ('a', 'b')
BLUE = ('c', 'd')
def __new__(cls, a, b):
entry = object.__new__(cls)
entry.a = entry._value_ = a # set the value, and the extra attribute
entry.b = b
return entry
def __repr__(self):
return f'<{type(self).__name__}.{self.name}: ({self.a!r}, {self.b!r})>'
我也添加了一个自定义__repr__
,默认只包括self._value_
. 现在每个条目的值由元组中的第一项定义,可用于查找枚举条目:
>>> Items.GREEN, Items.BLUE
(<Items.GREEN: ('a', 'b')>, <Items.BLUE: ('c', 'd')>)
>>> Items.BLUE.a
'c'
>>> Items.BLUE.b
'd'
>>> Items('a')
<Items.GREEN: ('a', 'b')>
有关更多选项,请参阅文档中的vs.部分。__init__
__new__