Python 只调用一次类方法
我创建了以下类:Python 只调用一次类方法,python,pandas,Python,Pandas,我创建了以下类: 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_di
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数据帧,我希望通过文件路径和包含元信息的字典(称为“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”应该只是一个属性,在本例中是一个字典
我怎样才能解决这个问题?也许整个类的设计都不好,应该改变(我对使用类是新手)?谢谢你的回答 调用
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)
另一种缓存变量的方法是使用:
谢谢你的回答!你帮了我很多:)。我只是不知道,除了对pandas数据框进行初始化外,还可以向实例添加一些其他属性(在初始化中进行初始化时)。@John:不客气。使用缓存快捷方式“hack”更新了答案。需要知道的一件事是,如果在
\uuuu init\uuuu
中添加一个属性,则基类(DataFrame
在本例中)会产生一些严重的错误。熊猫是开源的,所以你可以随时检查。。。祝你好运,先生!
@property
def meta_dict(self):
if not hasattr(self, "_meta_dict"):
self._meta_dict = loader.Loader(path).dict
return self._meta_dict