如PEP435所述,可以通过以下方式定义enum
:
class Color(Enum):
red = 1
green = 2
blue = 3
结果enum members
的{{1}}可以按照定义顺序进行迭代:Color
。
这让我想起Color.red, Color.green, Color.blue
中的Form
,其中的字段可以按照它们在Django
子类中声明的顺序呈现。他们通过维护字段计数器来实现这一点,每次实例化新字段时,计数器值都会增加。
但是在Form
的定义中,我们没有类似Color
的内容,我们如何实现这一目标呢?
答案 0 :(得分:10)
在Python 3中,您可以使用元类自定义声明类的命名空间。例如,您可以使用OrderedDict
:
from collections import OrderedDict
class EnumMeta(type):
def __new__(mcls, cls, bases, d):
print(d)
return type.__new__(mcls, cls, bases, d)
@classmethod
def __prepare__(mcls, cls, bases):
return OrderedDict()
class Color(metaclass=EnumMeta):
red = 1
green = 2
blue = 3
打印
OrderedDict([('__module__', '__main__'), ('red', 1), ('green', 2), ('blue', 3)])
答案 1 :(得分:4)
在Python 2.x中,您可以使用我写的this horrible hack来回答一个稍微不同的问题,作为此类功能的基础。所以,真的,你做不到。 : - )