2014-09-24 35 views
0

我正在編寫一個應該或多或少持續運行的程序。如果我終止程序,或者如果它引發錯誤,我希望保存所有對象實例。爲此,我使用jsonpickle保存所有實例。當程序繼續時,我想繼續完全停止的地方。我的想法是這樣做的以下內容:從json覆蓋自我

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(那部分作品)以前保存的一個實例。但是,自我並沒有被我的代碼覆蓋。

我懷疑我必須在__new__中實現我想要做的事情。我閱讀了文檔,但是我有點失落。我很感激任何關於如何以一種好的方式實現我想要的建議。

+0

我真的懷疑它的運行比無限多。 – Hoopdady 2014-09-24 13:28:14

+1

所以你只能有一個'A'類的實例?爲什麼不在課堂外進行拆除? – 2014-09-24 13:35:38

回答

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那就完全失敗了。

無論如何,如果你只是假設你可以隨時在關機時在磁盤上寫入東西,你將會陷入困境;想想你拔出電源插頭會發生什麼:我建議儘快寫入(並調用一些刷新功能以確保修改也能寫入磁盤)。