【发布时间】:2011-05-26 11:06:56
【问题描述】:
我正在编写一个读取类属性并将它们存储在列表中的元类,但我希望列表(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>)]
这不尊重Listing 类的Column() 属性的声明顺序。如果我直接使用classDict,也无济于事。
我该如何继续?
【问题讨论】:
-
如果没有某种源代码级别的分析,我认为您无法按顺序排列它们。在任何情况下,顺序都应该是无关紧要的。
dict按键散列,这就是为什么您没有按顺序看到它的原因 -
完全是一个非常有建设性的问题。谢谢
-
您可以查看 tosca 小部件 2,了解如何操作