Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 只调用一次类方法_Python_Pandas - Fatal编程技术网

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