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 przypadkuself
. - Metoda
__next__
jest wywoływana przy każdej iteracji w pętlifor
. Zwraca kolejny element z kolekcji. Gdy elementy się skończą, zgłaszany jest wyjątekStopIteration
, informujący Pythona o zakończeniu iteracji. - W przykładowym użyciu klasy, iterujemy przez obiekt
my_numbers
za pomocą pętlifor
, 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.