33

クラスのインスタンスで特定のフィールドをピクルスにすることは避けたいと思います。現在、ピクルスにする前に、これらのフィールドを[なし]に設定しましたが、もっとエレガントな解決策があるかどうか疑問に思います。

4

3 に答える 3

44

選択可能なオブジェクトではないインスタンス属性を処理する1つの方法は、クラスインスタンスの状態を変更するために使用できる特別なメソッドを使用すること__getstate__()です__setstate__()。これが例です

class Foo(object):

    def __init__(self, value, filename):
        self.value = value
        self.logfile = file(filename, 'w')

    def __getstate__(self):
        """Return state values to be pickled."""
        f = self.logfile
        return (self.value, f.name, f.tell())

    def __setstate__(self, state):
        """Restore state from the unpickled state values."""
        self.value, name, position = state
        f = file(name, 'w')
        f.seek(position)
        self.logfile = f

のインスタンスFooがピクルス化されると、Pythonはインスタンスの__getstate__()メソッドを呼び出すときに返された値のみをピクルス化します。同様に、選択解除中に、Pythonは選択解除された値をインスタンスの__setstate__()メソッドへの引数として提供します。メソッド内では、__setstate__()選択した名前と位置の情報に基づいてファイルオブジェクトを再作成し、ファイルオブジェクトをインスタンスのlogfile属性に割り当てることができます。

参照:http ://www.ibm.com/developerworks/library/l-pypers.html

于 2010-02-27T02:14:46.290 に答える
19

との問題を解決する例がドキュメント__getstate__にあります__setstate__

于 2010-02-27T02:00:01.970 に答える
17

Picklingはオブジェクト__getstate____setstate__メソッドを使用します。それらをオーバーライドして、必要なフィールドを無視することができます。

# foo.py
class Foo:
    def __init__(self):
        self.bar = 1
        self.baz = 2

    def __getstate__(self):
        state = self.__dict__.copy()
        # Don't pickle baz
        del state["baz"]
        return state

    def __setstate__(self, state):
        self.__dict__.update(state)
        # Add baz back since it doesn't exist in the pickle
        self.baz = 0
# main.py
import pickle

from foo import Foo


foo = Foo()
print(f"Foo bar: {foo.bar} baz: {foo.baz}")

new_foo = pickle.loads(pickle.dumps(foo))
print(f"New bar: {new_foo.bar} baz: {new_foo.baz}")

出力:

Foo bar: 1 baz: 2
New bar: 1 baz: 0

ここに別の例があります:https ://docs.python.org/3/library/pickle.html#handling-stateful-objects

于 2019-01-11T01:32:26.993 に答える