Jak uczynić klasę w Pythonie iterowalną?

Iteracja to proces przechodzenia przez elementy kolekcji (takich jak listy lub słowniki) w sposób sekwencyjny. Python umożliwia iterację przez różne struktury danych za pomocą pętli for. Ale co, jeśli chcielibyśmy móc iterować przez własne klasy tak, jak możemy iterować przez listę lub krotkę? W tym artykule przyjrzymy się, jak możemy uczynić klasę iterowalną, implementując metody specjalne __iter__ i __next__.

Uczynienie klasy iterowalną

Aby klasa była iterowalna, musi zaimplementować dwie metody: __iter__ i __next__. Metoda __iter__ musi zwracać obiekt iteratora, który na siebie wskazuje (zwykle return self), a metoda __next__ musi zwracać kolejne elementy przy każdym wywołaniu. Kiedy nie ma więcej elementów, __next__ powinna zgłosić wyjątek StopIteration, sygnalizując, że iteracja została zakończona.

Poniżej znajduje się przykład, jak możemy to zrealizować, tworząc klasę reprezentującą prostą kolekcję liczb, przez którą możemy iterować:

class NumberCollection:
    def __init__(self, numbers):
        # Inicjalizacja kolekcji liczb
        self.numbers = numbers
        self.index = -1  # Początkowy indeks przed pierwszym elementem

    def __iter__(self):
        # Zwraca iterator, czyli obiekt siebie samego
        return self

    def __next__(self):
        # Przechodzi do następnego elementu
        if self.index < len(self.numbers) - 1:
            self.index += 1
            return self.numbers[self.index]
        else:
            # Kończy iterację
            raise StopIteration

# Użycie klasy NumberCollection
my_numbers = NumberCollection([1, 2, 3, 4, 5])

for num in my_numbers:
    print(num)  # Wyświetla liczby od 1 do 5

Wyjaśnienie kodu

  • Klasa NumberCollection jest przykładem iterowalnej kolekcji liczb. Przy inicjalizacji otrzymuje listę liczb.
  • Metoda __iter__ jest wymagana, aby uczynić obiekt klasy iterowalnym. Zwykle zwraca instancję iteratora, w tym przypadku self.
  • Metoda __next__ jest wywoływana przy każdej iteracji w pętli for. Zwraca kolejny element z kolekcji. Gdy elementy się skończą, zgłaszany jest wyjątek StopIteration, informujący Pythona o zakończeniu iteracji.
  • W przykładowym użyciu klasy, iterujemy przez obiekt my_numbers za pomocą pętli for, co skutkuje wyświetleniem wszystkich liczb w kolekcji.

Podsumowanie

Tworzenie własnych iterowalnych klas w Pythonie pozwala na bardziej zaawansowaną kontrolę nad procesem iteracji, otwierając drzwi do tworzenia bardziej skomplikowanych i elastycznych struktur danych. Implementacja metod __iter__ i __next__ jest kluczowa do uczynienia obiektu klasy iterowalnym, co pozwala na jego wykorzystanie z pętlą for oraz innymi funkcjami i konstrukcjami języka Python, które wspierają iterację.

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

Scroll to Top