从json覆盖self

时间:2014-09-24 13:25:13

标签: python instance jsonpickle

我正在编写一个应该或多或少地连续运行的程序。如果我终止程序,或者它抛出错误,我希望保存所有对象实例。为此,我使用jsonpickle保存所有实例。当程序继续时,我想继续我离开的地方。我的想法是做类似以下的事情:

class A(object):
    def __init__(self):
       try:
            with open('A.json', 'r') as fp:
                 self = jsonpickle.decode(json.load(fp))
       except IOError:
            self.X = 'defaultvalue'
            self.Y = 'defaultvalue'

其中A.json包含以前使用jsonpickle保存的A实例(该部分有效)。但是,我的代码不会覆盖self。

我怀疑我必须在__new__中实现我想做的事情。我阅读了文档,但是我有点迷失了。如果能以一种好的方式实现我想要的东西,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不知道jsonpicle,但是使用JSON你可以做这样的事情:

import json

class ClassA(object):
    def __init__(self):
       try:
            with open('A.json', 'r') as fp:
                 self.__dict__ = json.loads(fp.read())
       except IOError:
            self.X = 'defaultvalue'
            self.Y = 1

    def __del__(self):
       with open('A.json', 'wb') as fp:
          fp.write( json.dumps( self.__dict__) )

if __name__ == "__main__":       
   myobj  = ClassA()
   print "GOT X : " + str(myobj.X)
   print "GOT Y : " + str(myobj.Y)
   myobj.X += " RUN ME AGAIN "
   myobj.Y += 1
   myobj = None

请注意垃圾收集器调用__del__;至少对我来说,如果我没有myobj = None那么它完全失败了。

无论如何,如果你只是假设你可以在关机时总是在磁盘上写东西,那么你最终会遇到麻烦;想想拔出电源插头会发生什么:我建议尽快写(并调用一些刷新功能,以确保修改也写入磁盘)。