假设我有两个类,例如 Manager
和 Graph
,其中每个 Graph 都有对其管理器的引用,并且每个 Manager 都有对其管理器的图形集合的引用拥有。我希望能够做两件事
1) 复制一个图,这会执行深度复制,只不过新图引用与旧图相同的管理器。
2) 复制管理器,这会创建一个新管理器并复制其拥有的所有图表。
执行此操作的最佳方法是什么?我不想推出自己的深度复制实现,但标准 copy.deepcopy
似乎无法提供这种级别的灵活性。
最佳答案
您可以通过查看传递给 __deepcopy__
特殊方法的 memodic
轻松完成此操作:
class Graph(object):
def __init__(self, manager=None):
self.manager = None if manager is None else weakref.ref(manager)
def __deepcopy__(self, memodict):
manager = self.manager()
return Graph(memodict.get(id(manager), manager))
class Manager(object):
def __init__(self, graphs=[]):
self.graphs = graphs
for g in self.graphs:
g.manager = weakref.ref(self)
我假设您正在使用 weakref.ref
来打破 Graph
和 Manager
之间的循环;如果您使用其他东西,请适当调整。
>>> m = Manager([Graph(), Graph()])
>>> mc = copy.deepcopy(m)
>>> [g.manager() is mc for g in mc.graphs]
[True, True]
>>> copy.deepcopy(m.graphs[0]).manager() is m
True
关于Python 多重深度复制行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014042/