繁体   English   中英

Python 3.x:如何从类中保存和加载数据

[英]Python 3.x: How to save and load data from within a class

我想要一个在其初始化中检查filename存在的类。 如果这样做,则应使用filename初始化自身,否则应运行init。 之后,我可以运行save方法,保存整个对象。

我想要的草图:

class data(object):
    def __init__(self, filename):
        if does_not_exist(filename): # create new
             [... expensive computations]
             self.save(filename)
        else: # load existing
            with open(filename,'rb') as fp:
                self = pickle.load(fp)

    def save(self, filename):
        with open(filename,'wb') as fp:
        pickle.dump(self, fp)

加载时,我知道我可以做类似的事情

tmp = pickle.load(fp)
    self.a = tmp.a
    self.b = tmb.b
    ...

但我希望有更好的方法


我认为这个问题以前曾被问过,但是找不到它:/

__init__self赋值是没有意义的,因为您没有修改self指向的对象,而是将函数中的变量名称self绑定到了另一个对象。

您可以做的是使用staticmethodclassmethod从缓存执行可选加载:

class Data(object):
    @classmethod
    def init_cached(cls, filename):
        if not os.path.exists(filename):  # create new
            result = cls(filename)
            result.save(filename)
            return result
        else:
            with open(filename, 'rb') as fp:
                return pickle.load(fp)

    def __init__(self, filename):
        pass  # [... expensive computations]

现在,使用Data.init_cached()而不是Data()来初始化您的对象。


更花哨的方法将涉及重写Data.__new__()来实现相同的目的,但是使用Data()进行初始化将透明地检查是否存在缓存的版本:

class Data(object):
    def __new__(cls, filename):
        if not os.path.exists(filename):  # create new
            return super(Data, cls).__new__(cls, filename, _save=True)
        else:
            with open(filename, 'rb') as fp:
                return pickle.load(fp)

    def __init__(self, filename, _save=False):
        # [... expensive computations]
        if _save:
            self.save(filename)

进一步阅读: Python对__new____init__的使用?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM