首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户定义类上复制模块的默认行为

用户定义类上复制模块的默认行为
EN

Stack Overflow用户
提问于 2015-11-27 22:37:34
回答 1查看 771关注 0票数 6

copy.copycopy.deepcopy在没有__copy____deepcopy__方法的用户定义类的实例上被调用时,会发生什么呢?官方文件在这件事上是令人不安的不明确的。函数是否总是返回同一个类的一个新实例,其中包含原始对象的__dict__的浅/深副本(或者当涉及__slots__时是什么等效的)?CPython、PyPy等人的行为会有所不同吗?Python 2和3之间的行为不同吗?(忽略旧式类。)是什么使我们需要定义显式的__copy__/__deepcopy__方法而不是使用默认行为?

对显式的引用(比隐式更好!)需要权威性的声明。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 01:18:41

通过阅读 module's source和其他文件,我确定了以下几点:

  • 当对用户定义的新样式类的实例调用copydeepcopy时,该实例没有__copy__方法,也没有向copy_reg.pickle注册可调用的方法,则调用实例的__reduce_ex__方法的协议为2。object定义了一个__reduce_ex__方法,该方法由所有不定义自己的新样式类继承,因此每个实例都有一个__reduce_ex__
  • __reduce__返回可用于酸洗的值,而copy模块使用这些值来模拟无酸洗,创建并返回从原始对象状态生成的新对象。此外,在使用deepcopy时,对象的状态(特别是__reduce_ex__/__reduce__返回的元组的第三个元素)在应用到新对象之前会被递归地复制。
  • 一些基本测试表明,在简单用户定义的类的实例__reduce_ex__(2)上调用(<function __newobj__>, (type(x),), x.__dict__, None, None)返回(<function __newobj__>, (type(x),), x.__dict__, None, None)。在Python2和Python3中,如果类没有__setstate__方法,那么copy模块将执行以下操作: 可调用,args,state,_,_= x.__reduce_ex__(2) y=可调用(*args)

因此,在用户定义类的实例上,copy函数的默认行为实际上是执行有用的简单操作,并使用原始对象的状态(可能是深度副本)创建一个新对象。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33965606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档