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_
答案

它看起来很有效,但是当有很多属性时,制作setto_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特定属性的主要内容,如果未能解决你的问题,请参考以下文章

使用特定对象而不是对象属性获取核心数据

需要对特定 R 代码片段的解释

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

android在特定片段中隐藏工具栏

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

嵌套字典 copy() 还是 deepcopy()? [复制]