在这个示例代码中,我试图让整堆数据可以调用:
class Data(object):
def __init__(self, data):
self._raw_data = data
for key, val in data.items():
if isinstance(val, dict):
if 'data' in val.keys():
setattr(self, key, Dataset(val))
else:
setattr(self, key, Data(val))
else:
setattr(self, key, val)
def __getattr__(self, name):
return None
@property
def raw(self):
return self._raw_data
class Dataset(Data):
def __init__(self, data):
self._raw_data = data
super().__init__(data)
for entry in self.data:
# need to debug this
self.data[self.data.index(entry)] = Data(entry)
最终发生的是这件事。我会尝试:
>>> example = {'dataset': {'id': 1, 'data': [{'param1': 3, 'param2': 4}, {'param1': 5, 'param2': 6}]}}
>>> data1 = Data(example)
>>> print(data1.dataset.id)
1
现在按预期工作。最后一行的问题,导致数据集对象中的__raw_data属性发生变化,我不知道如何(也看起来不对)。显然,我并不了解有关遗传的重要事项。我想要做的是将所有数据放入可调用属性,但也保留原始数据用于各种目的。这就是我得到的:
>>> print(data1.raw)
{'dataset': {'id': 1, 'data': [<wtf.Data object at 0x102a8da58, <wtf.Data object at 0x102a8da90>]}}
然而,它应该返回原始数据:
>>> print(data1.raw)
{'dataset': {'id': 1, 'data': [{'param1': 3, 'param2': 4}, {'param1': 5, 'param2': 6}]}}
适用于数据对象:
>>> for item in data1.dataset.data:
... print(item.raw)
{'param2': 4, 'param1': 3}
{'param2': 6, 'param1': 5}
感谢您的帮助。