我写一个元类读取类的属性,并将它们存储在列表中,但我想要的清单(cls.columns)尊重声明的顺序(即:mycol2
,mycol3
,zut
,cool
,menfin
,a
在我示例):如何以与声明相同的顺序读取类属性?
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>)]
这不尊重Column()
属性的声明为了Listing
类。如果我直接使用classDict
,它也没有帮助。
我该怎么办?
我不认为你可以让他们以没有某种形式的源代码级的分析。无论如何,这个命令应该是无关紧要的。 'dict'通过键进行哈希运算,这就是为什么你没有按顺序看到它的原因 – Robert 2010-12-16 10:13:42
完全是一个非常有建设性的问题。谢谢 – pylover 2014-12-11 03:58:29
你可以看看tosca部件2,找到如何做到这一点 – pylover 2014-12-11 04:04:23