如何"deepcopy"Python对象跳过一个或多个属性?
How to "deepcopy" Python object skipping one or more attributes?
我正在尝试创建一个简单的 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,但对于更复杂的情况我想使用深度复制功能。)
不确定这是否是最佳或正确的方法,但我最终想出了以下方法:
def __deepcopy__(self, memo):
cls = self.__class__
obj = cls.__new__(cls)
memo[id(self)] = obj
for k, v in self.__dict__.items():
if k == ['skipped']:
v = dict()
setattr(obj, k, deepcopy(v, memo))
pass
return obj
我正在尝试创建一个简单的 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,但对于更复杂的情况我想使用深度复制功能。)
不确定这是否是最佳或正确的方法,但我最终想出了以下方法:
def __deepcopy__(self, memo):
cls = self.__class__
obj = cls.__new__(cls)
memo[id(self)] = obj
for k, v in self.__dict__.items():
if k == ['skipped']:
v = dict()
setattr(obj, k, deepcopy(v, memo))
pass
return obj