我的班级代表各种系统的状态。每个实例都有两个属性:一个是在同一系统的所有状态之间共享的容器,另一个是每个实例唯一的容器。
状态副本应重用“共享”属性,但要创建“唯一”属性的深层副本。这实际上是唯一有意义的复制语义(状态副本自然是同一系统的状态)。
我想为阅读和维护我的代码的人创造最少的惊喜。我应该为我的目的覆盖__deepcopy__
或__copy__
吗?
答案 0 :(得分:3)
是否真的有必要使用复制模块复制此类的实例?我认为,不应该覆盖__copy__
或__deepcopy__
,而应该为您的类创建一个copy
方法,该方法使用您定义的复制语义返回一个新对象。
如果出于某些一致性原因,您确实需要使用复制模块,那么在我看来__deepcopy__
更合适。如果它是所有实例共享其中一个容器的类的已定义行为,那么可以合理地假设__deepcopy__
的实现会尊重该行为。
答案 1 :(得分:0)
这与您的情况类似吗?
import copy
class Foo(object):
shared = [[]]
def __init__(self):
self.perinstance = [[]]
如果是这样,那么您似乎不需要定义__copy__
或__deepcopy__
,因为copy.deepcopy
的默认行为共享类属性和deepcopies实例属性:
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])