Я пишу метакласс, который читает атрибуты класса и хранить их в списке, но я хочу, чтобы список (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