5

PEP435中所述,enum可以这样定义:

class Color(Enum):
    red = 1
    green = 2
    blue = 3

并且结果enum members可以Color按定义顺序迭代:Color.red, Color.green, Color.blue.

这让我想起了Formin Django,其中字段可以按照在Form子类中声明的顺序呈现。他们通过维护一个字段计数器来实现这一点,每次实例化一个新字段时,计数器值都会增加。

但是在 的定义中Color,我们没有类似 a 的东西,我们FormField如何实现呢?

4

2 回答 2

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)])
于 2013-05-13T03:07:09.420 回答
4

在 Python 2.x 中,您可以使用我写的这个可怕的 hack来回答一个稍微不同的问题,作为此类功能的基础。所以,真的,你不能。:-)

于 2013-05-13T04:24:00.827 回答