クラス属性を読み取ってリストに格納するメタクラスを作成していますが、リスト (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
しても、どちらも役に立ちません。
どうすれば続行できますか?