<p>好吧,我不得不读了这篇文章的源代码,但看起来这是一个非常简单的答案。
<a href="http://svn.python.org/projects/python/trunk/Lib/copy.py" rel="noreferrer">http://svn.python.org/projects/python/trunk/Lib/copy.py</a></p>
<p><code>copy</code>查找一些它知道构造函数是什么样子的内置类型(注册在<code>_copy_dispatch</code>字典中,当它不知道如何复制基本类型时,它导入<code>copy_reg.dispatch_table</code>。。。这是<code>pickle</code>注册它所知道的生成对象新副本的方法的地方。本质上,它是一个关于对象类型和“生成新对象的函数”这个“生成新对象的函数”与您为一个对象编写<code>__reduce__</code>或<code>__reduce_ex__</code>方法时编写的内容(如果其中一个丢失或需要帮助,它将遵循<code>__setstate__</code>、<code>__getstate__</code>等方法。在</p>
<p>这就是<code>copy</code>。基本上…(有一些附加条款…)</p>
<pre><code>def copy(x):
"""Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
"""
cls = type(x)
copier = _copy_dispatch.get(cls)
if copier:
return copier(x)
copier = getattr(cls, "__copy__", None)
if copier:
return copier(x)
reductor = dispatch_table.get(cls)
if reductor:
rv = reductor(x)
else:
reductor = getattr(x, "__reduce_ex__", None)
if reductor:
rv = reductor(2)
else:
reductor = getattr(x, "__reduce__", None)
if reductor:
rv = reductor()
else:
raise Error("un(shallow)copyable object of type %s" % cls)
</code></pre>
<p><code>deepcopy</code>执行与上述相同的操作,但除此之外,还要检查每个对象并确保每个新对象都有一个副本,而不是指针引用。<code>deepcopy</code>构建它自己的<code>_deepcopy_dispatch</code>表(dict),它在其中注册函数,以确保生成的新对象没有指向原始对象的指针引用(可能是用<code>copy_reg.dispatch_table</code>中注册的<code>__reduce__</code>函数生成的)</p>
<p>因此,编写一个<code>__reduce__</code>方法(或类似方法)并将其注册到<code>copy_reg</code>中,应该可以使<code>copy</code>和{<cd10>}也能完成它们的工作。在</p>