Jak sprawić, by klasa w Pythonie była iterowalna?

Iterowalność obiektów jest jedną z kluczowych cech języka Python, pozwalającą na przechodzenie przez elementy kolekcji (takich jak listy czy słowniki) za pomocą pętli. Co jednak, jeśli chcemy, aby nasza własna klasa również była iterowalna? Python umożliwia to poprzez zaimplementowanie w klasie metod specjalnych __iter__() i __next__(). W tym artykule przyjrzymy się, jak to zrobić na praktycznym przykładzie.

Kompletny przykład klasy iterowalnej

Załóżmy, że chcemy stworzyć klasę Countdown, która pozwoli na iterację od określonego liczby w dół, aż do zera. Pokażemy, jak zaimplementować taką funkcjonalność, korzystając z metod __iter__() i __next__().

class Countdown:
    def __init__(self, start):
        # Inicjalizacja startowej wartości licznika
        self.current = start

    def __iter__(self):
        # Iterator zwraca sam siebie
        return self

    def __next__(self):
        # Zwrócenie bieżącej wartości i dekrementacja
        if self.current < 0:
            raise StopIteration  # Zakończenie iteracji
        else:
            num = self.current
            self.current -= 1
            return num

# Użycie klasy Countdown
countdown = Countdown(3)
for number in countdown:
    print(number)
# Wypisze kolejno: 3, 2, 1, 0

W powyższym przykładzie, klasa Countdown inicjalizowana jest z wartością początkową, od której następuje odliczanie. Metoda __iter__() po prostu zwraca instancję obiektu (samą siebie), co jest wymagane, by obiekt był iterowalny. Metoda __next__() zwraca kolejne wartości w sekwencji odliczania, a gdy osiągnięte zostanie zero, wywoływana jest wyjątek StopIteration, informujący Pythona o zakończeniu iteracji.

Podsumowanie

Tworzenie własnych klas iterowalnych w Pythonie otwiera przed programistami drzwi do tworzenia bardziej zaawansowanych i elastycznych struktur danych, które mogą być używane z natywnymi konstrukcjami języka, takimi jak pętle for. Kluczem do iterowalności jest zaimplementowanie metod __iter__() oraz __next__(), co umożliwia obiektom klasy zachowywanie się jak generator lub kolekcja. Jak widać na przykładzie klasy Countdown, Python oferuje prosty i elegancki sposób na osiągnięcie tego celu.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Python w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top