中断for循环后如何重置指针

时间:2019-10-30 10:40:25

标签: python class iterable

我有一个想要进行迭代的名为ObjectSet的类。它会在for循环后重置我的“指针”,但如果我中断循环则不会重置。

我的类ObjectSet具有在所附代码中定义的方法。我遍历一个对象集,当我找到一个特定的对象时,我中断了循环,但是我不知道在这种情况下如何以一种很好的方式重置指针。

class ObjectSet:

   def __init__(self,objects = None):
      if not objects: self.objects = []
      else: self.objects = objects
      self.pointer = 0
   def __iter__(self):
      return self
   def __len__(self):
      return len(self.objects)
   def __next__(self):
      cur_pointer = self.pointer
      if cur_pointer >= len(self):
         self.pointer = 0
         raise StopIteration
      self.pointer += 1
      return self.objects[cur_pointer]


objs = ObjectSet([1,2,3])
for obj in objs:
   if obj == 2:
      break
for obj in objs:
   print(obj)

该代码只打印3,但我希望它像列表一样打印1,2和3。

1 个答案:

答案 0 :(得分:1)

您可以实现iterator pattern

但是鉴于您的基本数据结构已经支持迭代,您可以这样做:

def __iter__(self):
    return iter(self.objects)

(并从您的班级中删除__next__方法和self.pointer)。

设计的问题是,类self.pointer的每个实例只有一个ObjectSet。但正如您注意到的那样,只有返回的迭代器才应该记住下一个位置。这就是迭代器模式将为您完成的工作。