82

クラスのピクルを行うだけの Save および Load 関数をクラスに実装する必要があります。しかし、以下のように「self」を使用することはできないようです。どうすればこれを行うことができますか?

self = cPickle.load(f)

cPickle.dump(self,f,2)
4

5 に答える 5

49

これが私がやったことです。__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()
于 2010-05-16T06:01:54.677 に答える
27

ダンプ部分は、あなたが提案したとおりに機能するはずです。ロード部分では、指定されたファイルからインスタンスをロードして返す @classmethodを定義できます。

@classmethod
def loader(cls,f):
    return cPickle.load(f)

次に、呼び出し元は次のようにします。

class_instance = ClassName.loader(f)
于 2010-04-25T20:29:12.583 に答える
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

ピクルを文字列に保存したかったのでloads、 anddumpsの代わりにloadandを使用しました。とファイルへのdump使用も機能します。そして、実際には、後で使用するために、クラス インスタンスをファイルにピクルするために使用できます...クラスが対話的に定義されている場合でも。上から続けて…loaddumpdill

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

于 2014-08-04T21:54:40.883 に答える
2

docs には、ここでインスタンスをピクルする方法の例があります。(「TextReader」の例を検索してください)。アイデアは__getstate____setstate__メソッドを定義することです。これにより、どのデータをピクルする必要があるか、およびそのデータを使用してオブジェクトを再インスタンス化する方法を定義できます。

于 2010-04-25T20:24:31.097 に答える