按照声明的顺序遍历类成员
我在编写一个将类映射到简单表视图的小GUI库时遇到了这个问题。每个特定类型的类成员=列,列的顺序很重要。但…
class Person(object):
name = None
date_of_birth = None
nationality = None
gender = None
address = None
comment = None
for member in Person.__dict__.iteritems():
if not member[1]:
print member[0]
输出:
comment
date_of_birth
name
address
gender
nationality
...
嗯,奇怪的是,一切混在一起…希望的输出:
name
date_of_birth
nationality
gender
address
comment
有没有办法在不维护额外OrderedDict()
列的情况下做到这一点?
-
在Python3中,可以通过使用PEP3115允许您在构造类时覆盖元类中的dict类型(例如,使用跟踪插入顺序的OrderedDict)。这是此方法的实现:
class OrderedMeta(type): @classmethod def __prepare__(metacls, name, bases): return OrderedDict() def __new__(cls, name, bases, clsdict): c = type.__new__(cls, name, bases, clsdict) c._orderedKeys = clsdict.keys() return c class Person(metaclass=OrderedMeta): name = None date_of_birth = None nationality = None gender = None address = None comment = None for member in Person._orderedKeys: if not getattr(Person, member): print(member)
在Python2中,这要棘手得多。这可以通过相当棘手的事情来实现,例如对源进行自省,并根据AST来确定定义顺序,但这可能比它的价值要麻烦得多。