【发布时间】:2021-06-20 08:35:38
【问题描述】:
我正在尝试创建一个简单的 deepcopy 函数,它只是跳过一些对象属性,但我下面的原型实现进入了无限递归。这是正确的方法吗?
from copy import deepcopy
class Foo():
def __init__(self):
self.copied = 1
self.skipped = 2
def __deepcopy__(self, memo):
obj = type(self)()
for attr in dir(self):
if attr in ['skipped']:
continue
attr_copy = deepcopy(getattr(self, attr), memo)
setattr(obj, attr, attr_copy)
pass
return obj
o1 = Foo()
o2 = deepcopy(o1)
(我知道在这个简单的情况下,我可以在新实例上使用 delattr,但对于更复杂的情况,我想使用 deepcopy 功能。)
【问题讨论】:
-
我认为问题在于您想要的实际上并不简单。例如。因为您使用
obj = type(self)(),如果Foo需要__init__()的一些参数而不是self,您的代码将无法工作。您应该检查copy模块的(python)源代码;它在你的 python 安装Lib文件夹中。