<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <link rel="STYLESHEET" href="lib.css" type='text/css' /> <link rel="SHORTCUT ICON" href="../icons/pyfav.gif" /> <link rel='start' href='../index.html' title='Python Documentation Index' /> <link rel="first" href="lib.html" title='Python Library Reference' /> <link rel='contents' href='contents.html' title="Contents" /> <link rel='index' href='genindex.html' title='Index' /> <link rel='last' href='about.html' title='About this document...' /> <link rel='help' href='about.html' title='About this document...' /> <LINK rel="prev" href="pickle-sub.html"> <LINK rel="parent" href="module-pickle.html"> <LINK rel="next" href="module-cPickle.html"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name='aesop' content='information' /> <META name="description" content="Example "> <META name="keywords" content="lib"> <META name="resource-type" content="document"> <META name="distribution" content="global"> <title>3.14.7 Example </title> </head> <body> <DIV CLASS="navigation"> <div id='top-navigation-panel'> <table align="center" width="100%" cellpadding="0" cellspacing="2"> <tr> <td class='online-navigation'><a rel="prev" title="3.14.6 Subclassing Unpicklers" href="pickle-sub.html"><img src='../icons/previous.png' border='0' height='32' alt='Previous Page' width='32' /></A></td> <td class='online-navigation'><a rel="parent" title="3.14 pickle " href="module-pickle.html"><img src='../icons/up.png' border='0' height='32' alt='Up One Level' width='32' /></A></td> <td class='online-navigation'><a rel="next" title="3.15 cPickle " href="module-cPickle.html"><img src='../icons/next.png' border='0' height='32' alt='Next Page' width='32' /></A></td> <td align="center" width="100%">Python Library Reference</td> <td class='online-navigation'><a rel="contents" title="Table of Contents" href="contents.html"><img src='../icons/contents.png' border='0' height='32' alt='Contents' width='32' /></A></td> <td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png' border='0' height='32' alt='Module Index' width='32' /></a></td> <td class='online-navigation'><a rel="index" title="Index" href="genindex.html"><img src='../icons/index.png' border='0' height='32' alt='Index' width='32' /></A></td> </tr></table> <div class='online-navigation'> <b class="navlabel">Previous:</b> <a class="sectref" rel="prev" href="pickle-sub.html">3.14.6 Subclassing Unpicklers</A> <b class="navlabel">Up:</b> <a class="sectref" rel="parent" href="module-pickle.html">3.14 pickle </A> <b class="navlabel">Next:</b> <a class="sectref" rel="next" href="module-cPickle.html">3.15 cPickle </A> </div> <hr /></div> </DIV> <!--End of Navigation Panel--> <H2><A NAME="SECTION0051470000000000000000"><!--x--></A><A NAME="pickle-example"><!--z--></A> <BR> 3.14.7 Example </H2> <P> Here's a simple example of how to modify pickling behavior for a class. The <tt class="class">TextReader</tt> class opens a text file, and returns the line number and line contents each time its <tt class="method">readline()</tt> method is called. If a <tt class="class">TextReader</tt> instance is pickled, all attributes <i>except</i> the file object member are saved. When the instance is unpickled, the file is reopened, and reading resumes from the last location. The <tt class="method">__setstate__()</tt> and <tt class="method">__getstate__()</tt> methods are used to implement this behavior. <P> <div class="verbatim"><pre> class TextReader: """Print and number lines in a text file.""" def __init__(self, file): self.file = file self.fh = open(file) self.lineno = 0 def readline(self): self.lineno = self.lineno + 1 line = self.fh.readline() if not line: return None if line.endswith("\n"): line = line[:-1] return "%d: %s" % (self.lineno, line) def __getstate__(self): odict = self.__dict__.copy() # copy the dict since we change it del odict['fh'] # remove filehandle entry return odict def __setstate__(self,dict): fh = open(dict['file']) # reopen file count = dict['lineno'] # read from file... while count: # until line count is restored fh.readline() count = count - 1 self.__dict__.update(dict) # update attributes self.fh = fh # save the file object </pre></div> <P> A sample usage might be something like this: <P> <div class="verbatim"><pre> >>> import TextReader >>> obj = TextReader.TextReader("TextReader.py") >>> obj.readline() '1: #!/usr/bin/python' >>> # (more invocations of obj.readline() here) ... obj.readline() '7: class TextReader:' >>> import pickle >>> pickle.dump(obj,open('save.p','w')) </pre></div> <P> If you want to see that <tt class="module"><a href="module-pickle.html">pickle</a></tt> works across Python processes, start another Python session, before continuing. What follows can happen from either the same process or a new process. <P> <div class="verbatim"><pre> >>> import pickle >>> reader = pickle.load(open('save.p')) >>> reader.readline() '8: "Print and number lines in a text file."' </pre></div> <P> <div class="seealso"> <p class="heading"><b>See Also:</b></p> <dl compact class="seemodule"> <dt>Module <b><tt class="module"><a href="module-copyreg.html">copy_reg</a></tt>:</b> <dd>Pickle interface constructor registration for extension types. </dl> <P> <dl compact class="seemodule"> <dt>Module <b><tt class="module"><a href="module-shelve.html">shelve</a></tt>:</b> <dd>Indexed databases of objects; uses <tt class="module">pickle</tt>. </dl> <P> <dl compact class="seemodule"> <dt>Module <b><tt class="module"><a href="module-copy.html">copy</a></tt>:</b> <dd>Shallow and deep object copying. </dl> <P> <dl compact class="seemodule"> <dt>Module <b><tt class="module"><a href="module-marshal.html">marshal</a></tt>:</b> <dd>High-performance serialization of built-in types. </dl> </div> <P> <DIV CLASS="navigation"> <div class='online-navigation'><hr /> <table align="center" width="100%" cellpadding="0" cellspacing="2"> <tr> <td class='online-navigation'><a rel="prev" title="3.14.6 Subclassing Unpicklers" rel="prev" title="3.14.6 Subclassing Unpicklers" href="pickle-sub.html"><img src='../icons/previous.png' border='0' height='32' alt='Previous Page' width='32' /></A></td> <td class='online-navigation'><a rel="parent" title="3.14 pickle " rel="parent" title="3.14 pickle " href="module-pickle.html"><img src='../icons/up.png' border='0' height='32' alt='Up One Level' width='32' /></A></td> <td class='online-navigation'><a rel="next" title="3.15 cPickle " rel="next" title="3.15 cPickle " href="module-cPickle.html"><img src='../icons/next.png' border='0' height='32' alt='Next Page' width='32' /></A></td> <td align="center" width="100%">Python Library Reference</td> <td class='online-navigation'><a rel="contents" title="Table of Contents" rel="contents" title="Table of Contents" href="contents.html"><img src='../icons/contents.png' border='0' height='32' alt='Contents' width='32' /></A></td> <td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png' border='0' height='32' alt='Module Index' width='32' /></a></td> <td class='online-navigation'><a rel="index" title="Index" rel="index" title="Index" href="genindex.html"><img src='../icons/index.png' border='0' height='32' alt='Index' width='32' /></A></td> </tr></table> <div class='online-navigation'> <b class="navlabel">Previous:</b> <a class="sectref" rel="prev" href="pickle-sub.html">3.14.6 Subclassing Unpicklers</A> <b class="navlabel">Up:</b> <a class="sectref" rel="parent" href="module-pickle.html">3.14 pickle </A> <b class="navlabel">Next:</b> <a class="sectref" rel="next" href="module-cPickle.html">3.15 cPickle </A> </div> </div> <hr /> <span class="release-info">Release 2.3.4, documentation updated on May 20, 2004.</span> </DIV> <!--End of Navigation Panel--> <ADDRESS> See <i><a href="about.html">About this document...</a></i> for information on suggesting changes. </ADDRESS> </BODY> </HTML>