Deepcopy特定属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Deepcopy特定属性相关的知识,希望对你有一定的参考价值。
有没有办法以某种方式覆盖类的__copy__
方法,使得某些属性只被复制为引用而其他属性实际被复制?
为了澄清我的意思,这是我对如何做到这一点的猜测。考虑班级Spam
:
class Spam:
def __init__(self, val=0, val2=0):
self.eggs = []
self.foo = []
self.val = val
self.val2 = val2
假设我们想确保在copy.copy
对象上调用Spam
(即浅拷贝)时,其eggs
属性被深度复制到新对象中(因此原始对象属性的突变不会改变副本的eggs
属性) )。 “为什么你不只是deepcopy
然后整个对象?” - 因为,与eggs
不同,我们希望将foo
属性复制为参考(以便对所有副本都可以看到对它的更改)。
那么,以下是一个有效的方法吗?
to_be_copied = ['eggs'] # States which attributes are to be copied
def __copy__(self):
copy_ = Spam()
for attr in self.__dict__:
if attr in Spam.to_be_copied:
# Make an actual copy of the attribute
copy_.__dict__[attr] = copy.copy(self.__dict__[attr])
else:
# Copy reference
copy_.__dict__[attr] = self.__dict__[attr]
return copy_
答案
它看起来很有效,但是当有很多属性时,制作set
的to_be_copied
会使操作更快。
另外,缩短三元表达式+列表理解,如下所示
to_be_copied = {'eggs'} # States which attributes are to be copied
def __copy__(self):
copy_ = Spam()
copy_.__dict__ = {attr:copy.copy(self.__dict__[attr]) if attr in Spam.to_be_copied else self.__dict__[attr] for attr in self.__dict__}
return copy_
压倒__copy__
dunder方法的缺点是它不符合最不惊讶的原则:copy.copy
的用户在处理像list
这样的已知对象时会期望浅拷贝,你提供的是自定义副本。
也许最好定义一个def copy(self):
函数(正确记录)
以上是关于Deepcopy特定属性的主要内容,如果未能解决你的问题,请参考以下文章
append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途