Я почти уверен, что понимаю, к чему вы клоните. Вот простой пример:
class Graph:
def __init__(self, nodes):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes)
G = Graph([1, 2, 3, 4])
print G.nodegen.next()
H = G.copy()
print H.nodegen.next()
print G.nodegen.next()
Теперь, конечно, это напечатает 1 1 2
. Однако вы хотите, чтобы H.nodegen
запомнил состояние G.nodegen
, чтобы при вызове H.nodegen.next()
печаталось 2. Простой способ - сделать их одним и тем же объектом:
class Graph:
def __init__(self, nodes, nodegen=None):
self.nodes = list(nodes)
self.nodegen = self.iternodes() if nodegen is None else nodegen
def iternodes(self):
for node in self.nodes:
yield node
def copy(self):
return Graph(self.nodes, self.nodegen)
Это напечатает 1 2 3
, так как вызов H.nodegen.next()
также продвинет G.nodegen
. Если это не то, что вы хотите, мне кажется, что я могу сохранить внутренний счетчик, например:
class Graph:
def __init__(self, nodes, jnode=0):
self.nodes = list(nodes)
self.nodegen = self.iternodes()
self.jnode = jnode
def iternodes(self):
while self.jnode < len(self.nodes):
self.jnode += 1
yield self.nodes[self.jnode-1]
def copy(self):
return Graph(self.nodes, self.jnode)
Это напечатает 1 2 2
, что я подозреваю, что вы хотите. Конечно, вам придется изменить то, как вы заботитесь о таких вещах, как аннулирование итераторов, когда вы меняете self.nodes
, но я думаю, что это должно быть довольно просто.