[英]Exclude object's field from pickling in python
我想避免在類的實例中對某些字段進行酸洗。 目前,在酸洗之前,我只是將這些字段設置為無,但我想知道是否有更優雅的解決方案?
處理非picklable對象的實例屬性的一種方法是使用可用於修改類實例狀態的特殊方法: __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__()
方法時腌制返回給它的值。 同樣,在 unpickling 期間,Python 將提供 unpickled 值作為實例的__setstate__()
方法的參數。 在__setstate__()
方法中,我們能夠根據我們腌制的名稱和位置信息重新創建文件對象,並將文件對象分配給實例的日志文件屬性。
參考: http : //www.ibm.com/developerworks/library/l-pypers.html
文檔中有一個示例可以解決您的__getstate__
和__setstate__
問題。
__getstate__
使用對象的__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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.