Python中是否有类似NSCoding的工具?

时间:2014-01-26 15:50:40

标签: python nscoding object-persistence

作为最近尝试使用Python的iOS开发人员,我很想知道是否有类似NSCoding的东西可以让我实现一个方法或一对方法来定义我的对象如何自动保存到磁盘,很像NSCoding

我发现this repo但我不确定它是否是更大框架的一部分,我宁愿不将其纳入我的(小)项目。

Python附带了什么东西吗?那些受欢迎的东西以原始但强大的方式处理对象持久性?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

至于__getstate____setstate__实现,这里有一些注释:

  1. 您实际上并不需要实现这些,默认情况下所有对象都是可选择的。因此,除非您的对象包含以下内容:文件,套接字,数据库连接等,否则它们是可选择的。
  2. 基本上__getstate__应该返回一些可拾取的内容。 __setstate__(从磁盘加载后)将重新捕获此对象作为唯一参数,并应重建当前实例。大多数__getstate__的实现都会返回touple或dict,但我想这取决于你。
  3. 请注意,覆盖这些方法也会改变copy.copycopy.deepcopy的工作方式(如果在这些方法中进行一些验证,可能会造成严重的痛苦)。
  4. 至于示例实现,请看一下(它是从我的代码中删除的,在这里我覆盖了一些超类的pickle方法):

    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')