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

时间:2017-05-22 22:45:54

标签: python python-3.x

我想要一个在初始化时检查是否存在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
    ...

但我希望有更好的方法

我认为之前已经问过这个问题,但找不到它:/

1 个答案:

答案 0 :(得分:2)

self内分配给__init__是没有意义的,因为您并未修改self指向的对象 - 您只是绑定变量名{ {1}}函数中的另一个对象。

您可以使用selfstaticmethod来执行缓存中的可选加载:

classmethod

现在,使用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()

进一步阅读:Python's use of __new__ and __init__?