クラスのピクルを行うだけの Save および Load 関数をクラスに実装する必要があります。しかし、以下のように「self」を使用することはできないようです。どうすればこれを行うことができますか?
self = cPickle.load(f)
cPickle.dump(self,f,2)
これが私がやったことです。__dict__
クラスに追加した新しいメンバー変数を保持し、オブジェクトが最後にピクルされたときにそこにあったものを更新するだけです。クラス自体の内部でコードの保存と読み込みを維持するのが最も簡単なように見えるので、コードを呼び出すと 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()
ダンプ部分は、あなたが提案したとおりに機能するはずです。ロード部分では、指定されたファイルからインスタンスをロードして返す @classmethodを定義できます。
@classmethod
def loader(cls,f):
return cPickle.load(f)
次に、呼び出し元は次のようにします。
class_instance = ClassName.loader(f)
__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
ピクルを文字列に保存したかったのでloads
、 anddumps
の代わりにload
andを使用しました。とファイルへのdump
使用も機能します。そして、実際には、後で使用するために、クラス インスタンスをファイルにピクルするために使用できます...クラスが対話的に定義されている場合でも。上から続けて…load
dump
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
docs には、ここでインスタンスをピクルする方法の例があります。(「TextReader」の例を検索してください)。アイデアは__getstate__
、__setstate__
メソッドを定義することです。これにより、どのデータをピクルする必要があるか、およびそのデータを使用してオブジェクトを再インスタンス化する方法を定義できます。