运行它(Python 3.3.1):
from collections import OrderedDict
class MyType(type):
@classmethod
def __prepare__(*args):
return OrderedDict()
class MyClass2(metaclass=MyType):
attr1 = 1
attr2 = 2
attr3 = 3
attr4 = 4
attr5 = 5
def __init__(self):
self.attr6 = 6
def func(self):
pass
print(MyClass2.__dict__.items())
我得到了:
dict_items([('__weakref__', <attribute '__weakref__' of 'MyClass2' objects>), ('__dict__', <attribute '__dict__' of 'MyClass2' objects>), ('__init__', <function MyClass2.__init__ at 0x7f08a106dc20>), ('__doc__', None), ('attr4', 4), ('attr5', 5), ('attr2', 2), ('attr3', 3), ('attr1', 1), ('func', <function MyClass2.func at 0x7f089f995c20>), ('__module__', '__main__')])
类属性未按其定义顺序排序。
使用OrderedDict
作为课程__dict__
,我做错了什么?
答案 0 :(得分:6)
mataclass中的__prepare__
方法允许您提供自己的自定义对象来代替用于类初始化的dict
。但是,您无法更改类实际使用的对象类型,这将是一个称为mappingproxy
的内部类型的实例,并且是无序的。如果要保留定义的属性必须单独存储的顺序:
class OrderedClass(type):
@classmethod
def __prepare__(metacls, name, bases):
return OrderedDict()
def __new__(cls, name, bases, classdict):
result = type.__new__(cls, name, bases, classdict)
result.member_names = list(classdict.keys())
return result
class MyClass2(metaclass=OrderedClass):
attr1 = 1
attr2 = 2
attr3 = 3
attr4 = 4
attr5 = 5
def __init__(self):
self.attr6 = 6
def func(self):
pass
>>> MyClass2.member_names
['__module__', '__qualname__', 'attr1', 'attr2', 'attr3', 'attr4', 'attr5', '__init__', 'func']