4

私は基本的に辞書のリストの周りに精巧なラッパーを持っています:

class Wrapper(object):
    def __init__(self, data):
        self.data = data

    def get(self, attr):
        return [d[attr] for d in self.data]

それで、

Wrapper([{'x': 23}, {'x': 42}, {'x': 5}]).get('x')

を返します[23, 42, 5]。ここで、省略形のプロパティを割り当てたいので、 。Wrapper.xと同じように返されWrapper.get('x')ます。data演繹的にどのキーが存在するかわからないので、私の現在のアプローチは(この質問から適応:

class Wrapper(object):
    def __init__(self, data):
        self.data = data
        for key in data[0].keys():
            setattr(self, key, property(lambda self: self.get(key)))

したがって、データのすべての要素が同じキーを持ち、それらはすべてPythonで有効な識別子であると想定されます。しかし、その後、Wrapper(...).x私は<property at 0x10a3d4838>何を間違っているのですか?

4

1 に答える 1

11

関数の名前を変更するだけで、実際にこれを簡単に行うことができます。

>>> class Wrapper(object):
...     def __init__(self, data):
...         self.data = data
...     def __getattr__(self, attr):
...         return [d[attr] for d in self.data]
... 
>>> Wrapper([{'x': 23}, {'x': 42}, {'x': 5}]).x
[23, 42, 5]

__getattr__()存在しない属性を要求するたびに、特別なメソッドが呼び出されます。ここでの唯一の潜在的な問題は、属性を割り当てることでこれをオーバーライドできることです。それを回避する必要がある場合は、単にオーバーライド__setattr__()して、それが発生しないようにします。

于 2012-05-10T10:45:47.560 に答える