Как заставить пользовательский класс работать с циклом for в Python? - PullRequest
0 голосов
/ 01 ноября 2019

Если у меня есть собственный класс, как я могу заставить его работать с циклом for in, например:

class number_range:
    def __init__(self, start, end):
        self.__data = []
        for i in range(start, end):
            self.__data.append(i)
    #something that will allow the for in loop

numbers = number_range(1, 100)          
for number in numbers:
    print(number)

1 Ответ

2 голосов
/ 01 ноября 2019

То, что вы ищете, это итератор. Например, этот действует как диапазон, но дает вам только нечетные числа:

class oddrange(object):
    def __init__(self, first, lastPlusOne):
        # Ensure start at first odd >= given start, store terminator.

        self.__curr = first + 1 - first % 2
        self.__term = lastPlusOne

    def __iter__(self):
        return self

    def __next__(self):
        # Terminate if range over, otherwise return current, calculate next.

        if self.__curr >= self.__term:
            raise StopIteration()

        (cur, self.__curr) = (self.__curr, self.__curr + 2)
        return cur

Вы можете увидеть это в действии с кодом вызова:

for i in oddrange(-5, 9): print(i, end = ' ')
print()
for i in oddrange(-3, 9): print(i, end = ' ')
print()
for i in oddrange(-4, 10): print(i, end = ' ')
print()
for i in oddrange(-4, 10): print(i, end = ' ')
print()

Это генерирует:

-5 -3 -1 1 3 5 7
-3 -1 1 3 5 7
-3 -1 1 3 5 7 9
-3 -1 1 3 5 7 9

Обратите внимание, что это не совместимо с Python 2, как и многие примеры в сети. Я думаю, что уже давно прошло время, мы все принимаем тот факт, что Python 2 готов, и продолжаем: -)

Если вам действительно нужно это нужно, вы можете просто добавить это в класс:

def next(self): return self.__next__()
...