我的类代表各种系统的状态。每个实例都有两个属性:一个是在同一系统的所有状态之间共享的容器,另一个是每个实例唯一的容器。
状态的副本应该重用“共享”属性,但要创建“唯一”属性的深层副本。这确实是唯一有意义的复制语义(状态的副本是同一系统的状态是很自然的)。
我想为阅读和维护我的代码的人创造最少的惊喜。我应该根据我的目的覆盖__deepcopy__或__copy__吗?
发布于 2012-04-21 06:04:53
是否真的需要使用copy模块来复制该类的实例?我认为,与其覆盖__copy__或__deepcopy__,不如为类创建一个copy方法,该方法使用您定义的复制语义返回一个新对象。
如果出于某些一致性原因,您确实需要使用复制模块,那么在我看来,__deepcopy__更合适。如果类的定义行为是所有实例共享其中一个容器,那么可以合理地假设__deepcopy__的实现将遵守这一点。
发布于 2012-04-21 06:08:36
这和你的情况相似吗?
import copy
class Foo(object):
shared = [[]]
def __init__(self):
self.perinstance = [[]]如果是这样,则看起来您不需要定义__copy__或__deepcopy__,因为copy.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])https://stackoverflow.com/questions/10253855
复制相似问题