按照声明的顺序遍历类成员

发布于 2021-01-29 17:14:50

我在编写一个将类映射到简单表视图的小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
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在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来确定定义顺序,但这可能比它的价值要麻烦得多。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看