繁体   English   中英

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

[英]How to get attributes in the order they are declared in a Python class?

PEP435中所述 ,可以通过以下方式定义enum

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

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

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

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

在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)])

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM