【发布时间】:2020-12-18 11:32:57
【问题描述】:
因此,我正在努力提高我的 OO 技能,并且正在开展一个需要使用不同数据集的项目。我有三个数据集,我们称它们为first_data、second_data 和third_data。我从它们各自的来源下载这些并将它们保存到pandas.DataFrames 中,每个数据集的一个方法称为make_*_data(),* 替换数据的名称。
我有一个名为 DataManager 的类构建,如下所示:
class DataManager:
""" Manages the datasets for this project.
TODO: add caching method to check for already downloaded files.
TODO: apply Singleton pattern to this class
"""
def __init__(self):
self._first_data = None
self._second_data = None
self._third_data = None
@property
def first_data(self):
if self._first_data is None:
self._first_data = make_first_data()
return self._first_data
@property
def second_data(self):
if self._first_data is None:
self._first_data = make_second_data()
return self._first_data
@property
def third_data(self):
if self._first_data is None:
self._first_data = make_third_data()
return self._first_data
现在,我不完全确定这是否是一个好方法,但这似乎可以解决问题。但是,我现在想对我拥有的每个数据集执行操作,例如训练 kNN 模型。我想要类似循环所有数据集的东西,并且已经研究过使用__getattr__ 或__getitem__,但是我在这里的森林里有点迷路,所以我正在寻找建议。
我的目标是在以下几行中发挥作用:
for dataset in DataManager.datasets:
# perform action for dataset
我正在寻找一种很好、干净的方式来实现它。我试过定义
# the __init__
self._datasets = {
"first_data": self._first_data,
"second_data": self._second_data,
"third_data": self._third_data
}
# the properties
def __getitem__(self, item):
return self._datasets[item]
但这不起作用,因为它将返回None。我可以用属性而不是私有属性替换DataManager.datasets 中的所有项目,但这只会在我想避免的初始化时运行所有下载。有什么建议吗?
【问题讨论】:
标签: python database oop iterator