4
import cPickle

class Foo(object):
    def __init__(self):
        self._data = {'bar': 'baz'}

    def __getattr__(self, name):
        assert hasattr(self, '_data')
        return self._data[name]

    # I even had to define this just to stop KeyError: '__getstate__'
    def __getstate__(self):
        return self.__dict__

foo = Foo()
bar = cPickle.dumps(foo)
cPickle.loads(bar)

これにより、アサーション エラーが発生します。

pickle/は、ダンプ時に文字列にcPickle変わり、その文字列を使用して、ロード時に新しいオブジェクトの を直接設定すると思いました。なぜ電話する必要があるのですか?それを回避するにはどうすれば変更できますか?__dict____dict__dumpsbar.__getattr__Foo

4

1 に答える 1

4

cPickleのドキュメントによると:http://docs.python.org/library/pickle.html

object.__getstate__()

クラスは、インスタンスのピクルス方法にさらに影響を与える可能性があります。クラスがメソッドを定義している場合__getstate__()、それが呼び出され、インスタンスのディクショナリのコンテンツではなく、インスタンスのコンテンツとして戻り状態が選択されます。メソッドがない場合は__getstate__()、インスタンス__dict__がピクルスになります。

ノート

選択解除時に、、、またはなどの一部のメソッド__getattr__()__getattribute__()インスタンス__setattr__()で呼び出される場合があります。これらのメソッドが内部不変条件がtrueであることに依存している場合、型はそのような不変条件を実装するか__getinitargs__()__getnewargs__()確立する必要があります。それ以外の場合は、どちら__new__()__init__()呼び出されません。

あなたはそれが真実であると主張しようとしているので、私はあなたがまたはhasattr(self, '_data')を使用する必要があると信じています。これは、pickleを使用する場合、classesメソッドが呼び出されないためです。__getinitargs__()__getnewargs__()__init__

于 2012-08-24T03:09:05.987 に答える