6

我的班级代表各种系统的状态。每个实例都有两个属性:一个是同一系统所有状态之间共享的容器,另一个是每个实例唯一的容器。

状态的副本应重用“共享”属性,但创建“唯一”属性的深层副本。这实际上是唯一有意义的复制语义(状态的副本自然是同一系统的状态)。

我想为阅读和维护我的代码的人创造最小的惊喜。我应该覆盖__deepcopy__还是__copy__为了我的目的?

4

2 回答 2

4

真的有必要使用 copy 模块来复制这个类的实例吗?我会争辩说,而不是重写__copy__,或者__deepcopy__您应该为您的类创建一个copy方法,该方法使用您定义的复制语义返回一个新对象。

如果出于某种一致性原因您确实需要使用复制模块,那么我认为__deepcopy__更合适。如果所有实例共享一个容器是类的定义行为,那么可以合理地假设实现__deepcopy__会尊重这一点。

于 2012-04-20T22:04:52.577 回答
0

这和你的情况相似吗?

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])
于 2012-04-20T22:08:36.453 回答