我的班级代表各种系统的状态。每个实例都有两个属性:一个是同一系统所有状态之间共享的容器,另一个是每个实例唯一的容器。
状态的副本应重用“共享”属性,但创建“唯一”属性的深层副本。这实际上是唯一有意义的复制语义(状态的副本自然是同一系统的状态)。
我想为阅读和维护我的代码的人创造最小的惊喜。我应该覆盖__deepcopy__
还是__copy__
为了我的目的?
我的班级代表各种系统的状态。每个实例都有两个属性:一个是同一系统所有状态之间共享的容器,另一个是每个实例唯一的容器。
状态的副本应重用“共享”属性,但创建“唯一”属性的深层副本。这实际上是唯一有意义的复制语义(状态的副本自然是同一系统的状态)。
我想为阅读和维护我的代码的人创造最小的惊喜。我应该覆盖__deepcopy__
还是__copy__
为了我的目的?
真的有必要使用 copy 模块来复制这个类的实例吗?我会争辩说,而不是重写__copy__
,或者__deepcopy__
您应该为您的类创建一个copy
方法,该方法使用您定义的复制语义返回一个新对象。
如果出于某种一致性原因您确实需要使用复制模块,那么我认为__deepcopy__
更合适。如果所有实例共享一个容器是类的定义行为,那么可以合理地假设实现__deepcopy__
会尊重这一点。
这和你的情况相似吗?
import copy
class Foo(object):
shared = [[]]
def __init__(self):
self.perinstance = [[]]
如果是这样,那么您似乎不需要定义__copy__
or __deepcopy__
,因为copy.deepcopy
共享类属性和 deepcopy 实例属性的默认行为:
x = Foo()
z = copy.deepcopy(x)
assert id(z.shared) == id(x.shared)
assert id(z.shared[0]) == id(x.shared[0])
assert id(z.perinstance) != id(x.perinstance)
assert id(z.perinstance[0]) != id(x.perinstance[0])