如何按照Python类中声明的顺序获取属性?

时间:2013-05-13 03:01:01

标签: python metaclass

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的内容,我们如何实现这一目标呢?

2 个答案:

答案 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来回答一个稍微不同的问题,作为此类功能的基础。所以,真的,你做不到。 : - )