类可以使用与控制酸洗相同的接口来控制复制。有关这些方法的信息,请参见模块pickle的描述。复制模块不使用copy_reg注册模块。
为了让一个类定义自己的副本实现,它可以定义特殊的方法__copy__()
和__deepcopy__()
。前者被称为实现浅拷贝操作;没有传递其他参数。后者被称为实现深度复制操作。它传递了一个参数,即备忘字典。如果__deepcopy__()
实现需要复制组件的深层副本,则应deepcopy()
以该组件为第一个参数,并以备注字典作为第二个参数来调用该函数。
由于您似乎不关心腌制自定义,因此定义__copy__
和__deepcopy__
绝对似乎是适合您的正确方法。
具体来说,__copy__
(浅表副本)在您的情况下非常容易…:
def __copy__(self):
newone = type(self)()
newone.__dict__.update(self.__dict__)
return newone
__deepcopy__
会类似(也接受memo
arg),但是在返回之前,它必须调用self.foo = deepcopy(self.foo, memo)
任何self.foo
需要深度复制的属性(本质上是容器属性-列表,字典,非原始对象,它们通过__dict__
s保存其他内容)。