<p>根据文件:</p>
<blockquote>
<h2>What can be pickled and unpickled?</h2>
<p>The following types can be pickled:</p>
<ul>
<li><p>None, True, and False</p></li>
<li><p>integers, floating point numbers, complex numbers </p></li>
<li><p>strings, bytes, bytearrays</p></li>
<li><p>tuples, lists, sets, and dictionaries containing only picklable objects</p></li>
<li><p>functions defined at the top level of a module (using def, not lambda)</p></li>
<li><p>built-in functions defined at the top level of a module</p></li>
<li><p>classes that are defined at the top level of a module </p></li>
<li><p>instances of such classes whose <code>__dict__</code> or the result of calling <code>__getstate__()</code> is picklable (see section Pickling Class Instances for details).</p></li>
</ul>
</blockquote>
<p>如您所见,模块不在列表中。注意,这在使用<code>deepcopy</code>时也是正确的,而且不仅适用于<code>pickle</code>模块,如<code>deepcopy</code>文档中所述:</p>
<blockquote>
<p>This module does not copy types like module, method, stack trace, stack frame, file, socket, window, array, or any similar types. It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged; this is compatible with the way these are treated by the pickle module.</p>
</blockquote>
<p>可能的解决方法是使用<code>@property</code>装饰器而不是属性。
例如,这应该有效:</p>
<pre><code> import numpy as np
import pickle
class Foo():
@property
def module():
return np
foo = Foo()
with open('test.out', 'wb') as f:
pickle.dump(foo, f)
</code></pre>