我基本上有一个围绕词典列表精心设计的包装器:
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
先验中存在哪些密钥,因此我目前的方法是(改编自this question:
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>
我做错了什么?
答案 0 :(得分:10)
您只需更改功能名称即可轻松完成此操作:
>>> 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__()
以阻止其发生。