2024-04-27 19:16:29 发布
网友
假设我有两个类,比如Manager和Graph,其中每个图都有对其管理器的引用,而每个管理器都引用了它所拥有的一组图。我想做两件事
Manager
Graph
1)复制一个图形,它执行深度复制,但新图形引用与旧图形相同的管理器。在
2)复制一个管理器,这将创建一个新的管理器并复制它拥有的所有图形。在
最好的办法是什么?我不想推出自己的deepcopy实现,但是标准copy.deepcopy似乎没有提供这种级别的灵活性。在
copy.deepcopy
像为类定义复制协议这样简单的事情呢?在
import copy class Graph(object): def __init__(self): self.data = [1,2,3] self.manager = None def __getstate__(self): return { 'data': self.data, 'manager': self.manager } def __setstate__(self, state): self.manager = state.pop('manager') for name, val in state.iteritems(): setattr(self, name, copy.copy(val)) class Manager(object): def __init__(self): self.data = [4,5,6] self.graphs = [] def __getstate__(self): return { 'data': self.data, 'graphs': self.graphs } def __setstate__(self, state): self.graphs = [copy.copy(g) for g in state.pop('graphs')] for name, val in state.iteritems(): setattr(self, name, copy.copy(val))
您只需将管理器定义为引用,其他所有内容都将按您希望的方式复制。在
示例:
您可以通过查看传递给__deepcopy__特殊方法的memodict轻松完成此操作:
__deepcopy__
memodict
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和{}之间的循环;如果你用的是其他的东西,那就适当调整一下。在
weakref.ref
如果graph中没有引用其他对象(只是简单的字段),那么copy.copy(graph)应该复制一个,而{}应该复制管理器及其图形,假设有一个列表,比如manager.graphs。在
copy.copy(graph)
manager.graphs
但总的来说,您是对的,copy模块没有这种灵活性,对于稍微花哨的情况,您可能需要自己动手。在
copy
像为类定义复制协议这样简单的事情呢?在
您只需将管理器定义为引用,其他所有内容都将按您希望的方式复制。在
示例:
^{pr2}$您可以通过查看传递给
__deepcopy__
特殊方法的memodict
轻松完成此操作:我假设你在这里使用}之间的循环;如果你用的是其他的东西,那就适当调整一下。在
^{pr2}$weakref.ref
来打破Graph
和{如果graph中没有引用其他对象(只是简单的字段),那么}应该复制管理器及其图形,假设有一个列表,比如
copy.copy(graph)
应该复制一个,而{manager.graphs
。在但总的来说,您是对的,
copy
模块没有这种灵活性,对于稍微花哨的情况,您可能需要自己动手。在相关问题 更多 >
编程相关推荐