クラスのインスタンスで特定のフィールドをピクルスにすることは避けたいと思います。現在、ピクルスにする前に、これらのフィールドを[なし]に設定しましたが、もっとエレガントな解決策があるかどうか疑問に思います。
3 に答える
選択可能なオブジェクトではないインスタンス属性を処理する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属性に割り当てることができます。
との問題を解決する例がドキュメント__getstate__
にあります__setstate__
。
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