Python自定义__copy__和__deepcopy__完整实现
如何为一个自定义类实现__copy__和__deepcopy__方法以控制拷贝行为?说明memo字典在深拷贝中的作用(如何避免循环引用重复拷贝)。给出一个包含文件句柄(不可拷贝)、缓存字典(浅拷贝共享)、内部列表(深拷贝独立)的混合拷贝示例。
回答
小字辈
import copy
class DataProcessor:
def __init__(self, data):
self.data = data # list,需要深拷贝
self.cache = {} # 缓存,浅拷贝共享
self.file = None # 文件句柄,不可拷贝
def __copy__(self):
# 浅拷贝:创建新对象,内部引用共享
new = DataProcessor.__new__(DataProcessor)
new.data = self.data # 引用共享
new.cache = self.cache # 引用共享
new.file = self.file # 引用共享
# 或者更简单地:
# return copy.copy(super())
return new
def __deepcopy__(self, memo):
# memo: 已拷贝对象的映射,避免循环引用
new = DataProcessor.__new__(DataProcessor)
memo[id(self)] = new # 注册避免重复
new.data = copy.deepcopy(self.data, memo)
new.cache = copy.copy(self.cache) # 浅拷贝缓存
new.file = self.file # 文件句柄直接引用(不可深拷贝)
return new
# 循环引用场景
proc = DataProcessor([1, 2, 3])
proc.ref = proc # 自引用
proc2 = copy.deepcopy(proc) # memo确保proc2.ref指向proc2而非新对象
memo字典的关键作用:
- 映射:
id(original) → copy - 当深拷贝遇到已拷贝的对象时,直接返回已创建的副本
- 防止循环引用导致无限递归
- 保证同一对象的多个引用指向同一个副本