如何读取类属性与声明的顺序相同? [英] How to read class attributes in the same order as declared?
本文介绍了如何读取类属性与声明的顺序相同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我编写一个读取类属性并将它们存储在列表中的元类,但我想要列表(cls.columns)遵守声明顺序(即:mycol2,mycol3,zut,cool,menfin,a我的例子):
I am writing a metaclass that reads class attributes and store them in a list, but I want the list (cls.columns) to respect the declaration order (that is : mycol2,mycol3,zut,cool,menfin,a in my exemple):
import inspect
import pprint
class Column(object):
pass
class ListingMeta(type):
def __new__(meta, classname, bases, classDict):
cls = type.__new__(meta, classname, bases, classDict)
cls.columns = inspect.getmembers(cls,lambda o:isinstance(o,Column))
cls.nb_columns = len(cls.columns)
return cls
class Listing(object):
__metaclass__ = ListingMeta
mycol2 = Column()
mycol3 = Column()
zut = Column()
cool = Column()
menfin = Column()
a = Column()
pprint.pprint(Listing.columns)
结果:
[('a', <__main__.Column object at 0xb7449d2c>),
('cool', <__main__.Column object at 0xb7449aac>),
('menfin', <__main__.Column object at 0xb7449a8c>),
('mycol2', <__main__.Column object at 0xb73a3b4c>),
('mycol3', <__main__.Column object at 0xb744914c>),
('zut', <__main__.Column object at 0xb74490cc>)]
这不尊重Listing类的Column()属性的声明顺序。
This does not respect the declaration order of Column() attributes for Listing class. if I use classDict directly, it does not help neither : How can I proceed ?
推荐答案
在Python 3中,只需使用<在将整个字典传递给类型.__ new __()之前,请存储它的
,像这样: .keys()
In Python 3, just use an OrderedDict
and store its .keys()
before passing the whole dict to type.__new__()
, like this:
import collections
class OrderedClassMembers(type):
@classmethod
def __prepare__(self, name, bases):
return collections.OrderedDict()
def __new__(self, name, bases, classdict):
classdict['__ordered__'] = [key for key in classdict.keys()
if key not in ('__module__', '__qualname__')]
return type.__new__(self, name, bases, classdict)
class Something(metaclass=OrderedClassMembers):
A_CONSTANT = 1
def first(self):
...
def second(self):
...
print(Something.__ordered__)
# ['A_CONSTANT', 'first', 'second']
这篇关于如何读取类属性与声明的顺序相同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文