One way to handle instance attributes that are not picklable objects is to use the special methods available for modifying a class instance's state: __getstate__()
and __setstate__()
. Here is an example
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
When an instance of Foo
is pickled, Python will pickle only the values returned to it when it calls the instance's __getstate__()
method. Likewise, during unpickling, Python will supply the unpickled values as an argument to the instance's __setstate__()
method. Inside the __setstate__()
method we are able to recreate the file object based on the name and position information we pickled, and assign the file object to the instance's logfile attribute.
Reference: http://www.ibm.com/developerworks/library/l-pypers.html
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…