Man*_*ert 4 python properties dynamic
我基本上有一个围绕词典列表的精心设计的包装器:
class Wrapper(object):
def __init__(self, data):
self.data = data
def get(self, attr):
return [d[attr] for d in self.data]
Run Code Online (Sandbox Code Playgroud)
所以,
Wrapper([{'x': 23}, {'x': 42}, {'x': 5}]).get('x')
Run Code Online (Sandbox Code Playgroud)
回报[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)))
Run Code Online (Sandbox Code Playgroud)
因此,假设数据的所有元素都具有相同的密钥,并且它们在python中都是有效的标识符.但是,Wrapper(...).x返回,<property at 0x10a3d4838>我做错了什么?
Gar*_*tty 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]
Run Code Online (Sandbox Code Playgroud)
在__getattr__()当你要求一个不存在的属性的特殊方法被调用.这里唯一的潜在问题是您可以通过分配属性来覆盖它.如果你需要避免这种情况,也可以简单地覆盖__setattr__()以阻止这种情况发生.
| 归档时间: |
|
| 查看次数: |
2432 次 |
| 最近记录: |