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 回答