クラスのコピー プロトコルを定義するような単純なものはどうでしょうか。
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))
マネージャーを参照として定義し、他のすべてを必要な方法でコピーするだけです。
例:
In [2]: m1 = Manager()
In [3]: g1 = Graph()
In [4]: g1.manager = m1
In [5]: g2 = copy.copy(g1)
In [6]: g2.manager is g1.manager
Out[6]: True
In [7]: g2.data is g1.data
Out[7]: False
In [8]: m1.graphs.extend([g1,g2])
In [9]: m2 = copy.copy(m1)
In [10]: m2.data is m1.data
Out[10]: False
In [11]: m2.graphs[0] is m1.graphs[0]
Out[11]: False
In [12]: m2.graphs[0].manager is m1.graphs[0].manager
Out[12]: True