Как правильно реализовать python __iter__ на классе? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь реплицировать python итерацию списка, но в отличие от python списки мой индекс l oop не перезапускается внутри вложенных циклов.

В настоящее время 1-й случай работает, как ожидалось, но второй случай циклов навсегда, поскольку внутренний и внешний l oop оба совместно используют один и тот же myClassObj, а внутренний l oop всегда сбрасывает индекс на начальное значение, поэтому внешний l oop никогда не завершается. Как заставить его вести себя как python встроенные списки?

class MyClass:
    """Iterator for looping over a sequence."""
    def __init__(self, seq):
        self.data = seq
        self.index = -1

    def __iter__(self):
        return self

    def __next__(self):
        """Return the next element, or else raise StopIteration error."""
        self.index += 1
        if self.index < len(self.data):
            return self.data[self.index]
        else:
            self.index = -1
            raise StopIteration()


myClassObj = MyClass('spa')

# Case1: This Works fine:
for i in range(2):
    for each in myClassObj:
        print(each)
    print()
print()

# Case2: This does not work correctly.
for each in myClassObj:
    for each1 in myClassObj:
        print('{}: {}'.format(each, each1))
    print()

Ожидаемое поведение для второго случая:

s: s
s: p
s: a

p: s
p: p
p: a

a: s
a: p
a: a
...