怎么腌自己?

时间:2010-04-25 20:16:25

标签: python pickle

我希望我的类能够实现Save and Load函数,它只是简单地修改了类。但显然你不能在下面的时尚中使用“自我”。你怎么能这样做?

self = cPickle.load(f)

cPickle.dump(self,f,2)

6 个答案:

答案 0 :(得分:41)

这就是我最终要做的事情。更新__dict__意味着我们保留我添加到类中的任何新成员变量,并只更新上次pickle对象时那些变量。这似乎是最简单的,同时在类本身内部保存和加载代码,因此调用代码只需要一个object.save()。

def load(self):
    f = open(self.filename, 'rb')
    tmp_dict = cPickle.load(f)
    f.close()          

    self.__dict__.update(tmp_dict) 


def save(self):
    f = open(self.filename, 'wb')
    cPickle.dump(self.__dict__, f, 2)
    f.close()

答案 1 :(得分:20)

转储部分应该按照您的建议工作。对于加载部分,您可以定义一个@classmethod来加载给定文件中的实例并将其返回。

@classmethod
def loader(cls,f):
    return cPickle.load(f)
然后调用者会做类似的事情:

class_instance = ClassName.loader(f)

答案 2 :(得分:8)

如果你想让你的课程从保存的泡菜中更新......你几乎必须使用__dict__.update,就像你自己的答案一样。它有点像猫追逐它的尾巴,但是......因为你要求实例基本上用先前的状态“重置”它自己。

你的答案略有调整。你实际上可以挑选self

>>> import dill
>>> class Thing(object):
...   def save(self):
...     return dill.dumps(self)
...   def load(self, obj):
...     self.__dict__.update(dill.loads(obj).__dict__)
... 
>>> t = Thing()
>>> t.x = 1
>>> _t = t.save()
>>> t.x = 2
>>> t.x
2
>>> t.load(_t)
>>> t.x
1

我使用loadsdumps代替loaddump,因为我希望将pickle保存为字符串。将loaddump用于文件也可以。 实际上,我可以使用dill将一个类实例挑选到一个文件中供以后使用......即使该类是以交互方式定义的。从上面继续......

>>> with open('self.pik', 'w') as f:
...   dill.dump(t, f)
... 
>>> 

然后停止并重新启动...

Python 2.7.10 (default, May 25 2015, 13:16:30) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('self.pik', 'r') as f:
...   t = dill.load(f)
... 
>>> t.x
1
>>> print dill.source.getsource(t.__class__)
class Thing(object):
  def save(self):
    return dill.dumps(self)
  def load(self, obj):
    self.__dict__.update(dill.loads(obj).__dict__)

>>> 

我正在使用dill,可在此处找到:https://github.com/uqfoundation

答案 3 :(得分:2)

有一个如何挑选实例here, in the docs的例子。 (向下搜索“TextReader”示例)。我们的想法是定义__getstate____setstate__方法,这些方法允许您定义需要腌制的数据,以及如何使用该数据重新实例化对象。

答案 4 :(得分:0)

这就是我的方法。优点是您无需创建新对象。您可以直接加载它。

def save(self):
    with open(self.filename, 'wb') as f:
        pickle.dump(self, f)

@classmethod
def load(cls, filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)

如何使用它:

class_object.save()
filename = class_object.filename
del class_object

class_object = ClassName.load(filename)

答案 5 :(得分:-3)

如何编写一个名为Serializable的类来实现dump和load并让你的类继承它?