我创建了以下类:
import loader
import pandas
class SavTool(pd.DataFrame):
def __init__(self, path):
pd.DataFrame.__init__(self, data=loader.Loader(path).data)
@property
def path(self):
return path
@property
def meta_dict(self):
return loader.Loader(path).dict
如果实例化了类,则实例变为pandas DataFrame,我希望通过其他属性(如文件路径和包含元信息的字典(称为“meta_dict”))进行扩展。
我想要的是以下内容:字典'meta_dict'应该是可变的。即,以下内容应该有效:
df = SavTool("somepath")
df.meta_dict["new_key"] = "new_value"
print df.meta_dict["new_key"]
但是,每次我使用语法'df.meta_dict'时,都会调用方法'meta_dict'并返回来自loader.Loader的原始'meta_dict',以便无法更改'df.meta_dict'。因此,语法会导致“KeyError:'new_key'”。 'meta_dict'只能被调用一次,如果被使用/称为第二/第三......时间则不会再被调用。第二个/第三个......时间'meta_dict'应该只是一个属性,在本例中是一个字典。
我该如何解决这个问题?也许这个类的整个设计都很糟糕,应该改变(我是新手使用类)?谢谢你的回答!
答案 0 :(得分:1)
当您致电loader.Loader
时,您每次都会创建一个新的字典实例。 @property
不会为您缓存任何内容,只是为调用者提供了一个方便的包装复杂的getter以获得干净的界面。
这样的事情应该有效。我还更新了path
变量,使其在类上正确绑定,并在path
属性中正确返回。
import loader
import pandas
class SavTool(pd.DataFrame):
def __init__(self, path):
pd.DataFrame.__init__(self, data=loader.Loader(path).data)
self._path = path
self._meta_dict = loader.Loader(path).dict
@property
def path(self):
return self._path
@property
def meta_dict(self):
return self._meta_dict
def update_meta_dict(self, **kwargs):
self._meta_dict.update(kwargs)
另一种缓存变量的方法是使用hasattr:
@property
def meta_dict(self):
if not hasattr(self, "_meta_dict"):
self._meta_dict = loader.Loader(path).dict
return self._meta_dict