我在编写一个将类映射到简单表视图的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()
列的情况下执行此操作?
答案 0 :(得分:7)
在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中确定定义顺序,但这可能比它的价值更麻烦。
答案 1 :(得分:4)
如果你需要的只是变量的集合,也许你应该使用namedtuple
。它还维护字段的顺序(因为它是一个元组)。
from collections import namedtuple
Person = namedtuple('Person', ('name',
'data_of_birth',
'nationality',
'gender',
'address',
'comment'))
print Person._fields
答案 2 :(得分:1)
好吧,这不是一个答案本身,而是一个只在原始问题的上下文中工作的解决方法(“每个类成员[是一个实例] 某种类型 =列,并且顺序列很重要“)。解决方案是将类变量_count
引入CertainType
类,并在每个实例化时递增它。之后,CertainType的所有类成员都被打包到一个使用key=attrgetter('_count')
P.S。省略“这是一个实例”部分是我的错误,并且它的解决方案范围有限。对不起。