[英]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 members
: Color.red, Color.green, Color.blue
。
这让我想起了Django
的Form
,其中的字段可以按照它们在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.