如何覆盖Python对象的复制/深度复制操作?

我理解复制模块中的copydeepcopy之间的区别。我曾经成功地使用过copy.copycopy.deepcopy,但这是我第一次真正地重载\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和方法。我已经在谷歌上搜索了一下内置的Python模块,寻找\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

以下是我的设想:

我有一个配置对象。首先,我将用一组默认值实例化一个配置对象。此配置将移交给多个其他对象(以确保所有对象以相同的配置启动)。然而,一旦用户交互开始,每个对象都需要独立地调整其配置,而不影响彼此的配置(这对我来说意味着我需要制作初始配置的deepcopy以供分发)

下面是一个示例对象:

类图表配置(对象):
定义初始化(自):
#图形特性(布尔值/字符串)
自抗锯齿=无
self.plot\u style=无
self.plot\u title=无
self.autoscale=无
#X轴属性(字符串/整数)
self.xaxis_title=无
self.xaxis\u tick\u rotation=无
self.xaxis\u tick\u align=None
#Y轴属性(字符串/整数)
self.yaxis_title=无
self.yaxis\u tick\u rotation=无
self.yaxis\u tick\u align=无
#非基本对象的列表
self.trace_configs=[]
定义复制(自我):
通过
def\uuuu deepcopy\uuuuu(自我,备忘录):
通过

在该对象上实现copydeepcopy方法以确保copy.copycopy.deepcopy的正确方法是什么

综合Alex Martelli的回答和Rob Young的评论,您可以得到以下代码:

从复制导入复制,深度复制
A类(对象):
定义初始化(自):
打印“init”
自我评价:v=10
self.z=[2,3,4]
定义复制(自我):
cls=自我分类__
结果=cls.\uuuu新\uuuuu(cls)
结果。记录更新(自我记录)
返回结果
def\uuuu deepcopy\uuuuu(自我,备忘录):
cls=自我分类__
结果=cls.\uuuu新\uuuuu(cls)
备注[id(自我)]=结果
对于k,v,在self.dict.items()中:
setattr(结果、k、深度拷贝(v、备忘录))
返回结果
a=a()
a、 v=11
b1,b2=副本(a),深度副本(a)
a、 v=12
a、 z.2(5)
打印b1.v、b1.z
打印b2.v,b2.z

印刷品

init
11 [2, 3, 4, 5]
11 [2, 3, 4]

此处\uuuu deepcopy\uuuu填写备忘录目录,以避免在对象本身从其成员引用时过度复制

发表评论