2014-01-26 62 views
1

作爲一名最近嘗試使用Python的iOS開發人員,我很想知道是否有像NSCoding這樣的東西可以讓我實現一個方法或一對方法,這些方法可以定義我的對象如何自動保存到磁盤,很像NSCoding在Python中是否存在類似於NSCoding的工具?

我找到了this repo,但我不確定它是否是更大的框架的一部分,我不想將它納入我的(小)項目。

是否有東西附帶Python?在那裏流行的那些以原始而強大的方式處理對象持久化的東西?

回答

2

pickle模塊用於序列化對象。

http://docs.python.org/2/library/pickle.html

你通常可以只使用它就好了,但如果你需要定義對象應該如何序列化,可以覆蓋特殊的方法,__getstate____setstate__

import cPickle as pickle # faster implementation 

path = 'test.dat' 
obj = ('Hello, world!', 123, {'x': 0}) 

# save to disk 
with open(path, 'wb') as fp: 
    pickle.dump(obj, fp) 

# load from disk 
with open(path, 'rb') as fp: 
    obj = pickle.load(fp) 

print obj 
+0

會是什麼'__getstate__'和'__setstate__'實現看起來像? – Moshe

0

至於__getstate____setstate__這裏有一些註釋:

  1. 你並不需要實現這些,所有對象默認都是可選的。所以除非你的對象包含諸如文件,套接字,數據庫連接之類的東西,否則它們是可以選擇的。
  2. 基本上__getstate__應該返回一些pickleable。而且從__setstate__(從磁盤加載後)將會收回這個對象,因爲它是唯一的參數,並且應該重建當前實例。大多數__getstate__的實現都會返回touple或dict,但我想這取決於你。
  3. 請注意,重寫這些方法也會改變copy.copycopy.deepcopy的工作方式(如果您在這些方法中進行一些驗證,可能會產生嚴重的痛苦)。

至於示例實現需要看看這個(它是從我的代碼剪斷了,這裏我重寫一些超泡菜的方法):

def __getstate__(self): 
    state = super(Simulation, self).__getstate__() 
    state['usercode'] = self.usercode 
    return state 

def __setstate__(self, state): 
    super(Simulation, self).__setstate__(state) 

    self.usercode = state.get('usercode', 'dosrznrc') 
相關問題