14

クラスを単純なテーブルビューにマップする小さな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()追加の列を維持せずにそれを行う方法はありますか?

4

3 に答える 3

10

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から定義の順序を決定するなど、かなりハッキーな方法で実現できますが、それはおそらく価値があるよりもはるかに厄介です。

于 2012-07-02T15:20:49.053 に答える
4

変数の集合だけが必要な場合は、namedtuple代わりに a を使用する必要があります。また、フィールドの順序も維持されます (タプルであるため)。

from collections import namedtuple
Person = namedtuple('Person', ('name',
                               'data_of_birth',
                               'nationality',
                               'gender',
                               'address',
                               'comment'))
print Person._fields
于 2012-07-02T14:55:55.683 に答える
1

わかりました、それ自体は答えではありませんが、元の質問のコンテキストでのみ機能する回避策です(「特定のタイプの[インスタンスである]すべてのクラスメンバー=列、および列の順序が重要です」)。解決策は、クラス変数_countをクラスに導入CertainTypeし、インスタンス化のたびにインクリメントすることです。その後、特定のタイプのすべてのクラス メンバーは、次を使用して並べ替えられるリストにパックされます。key=attrgetter('_count')

PS「これはインスタンスです」の部分を省略したのは私の間違いであり、ソリューションの範囲がかなり制限されています。そのために残念。

于 2012-07-03T19:19:11.117 に答える