只调用一次类方法

时间:2017-03-21 09:49:38

标签: 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_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'应该只是一个属性,在本例中是一个字典。

我该如何解决这个问题?也许这个类的整个设计都很糟糕,应该改变(我是新手使用类)?谢谢你的回答!

1 个答案:

答案 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