Polimorfizm

1. Polimorfizm – podstawy

Polimorfizm (ang. polymorphism) oznacza możliwość stosowania tego samego interfejsu do obiektów różnych klas, tak aby różne obiekty reagowały w odpowiedni dla siebie sposób.

1.1 Polimorfizm metod

  • Dzięki polimorfizmowi można wywołać tę samą metodę na różnych obiektach, bez potrzeby sprawdzania typu obiektu.
  • Różne klasy mogą mieć metodę o tej samej nazwie, ale zachowującą się inaczej.

Przykład:

Wyjaśnienie:

  • Funkcja wydaj_dzwiek działa z każdym obiektem, który ma metodę dzwiek.
  • Nie interesuje nas typ obiektu – liczy się wspólny interfejs.

1.2 Polimorfizm operatorów

  • Python umożliwia przeciążanie operatorów za pomocą metod specjalnych (dunder methods).
  • Pozwala stosować standardowe operatory (+, -, *, ==) do obiektów własnych klas.

Przykład operatora + w klasie:

Wyjaśnienie:

  • Operator + został polimorficznie zdefiniowany dla obiektów klasy Punkt.
  • Wywołanie p1 + p2 korzysta z metody __add__, co pozwala dodać obiekty w sposób zależny od klasy.

2. Metody specjalne (dunder methods)

Metody specjalne (ang. dunder methods) zaczynają i kończą się podwójnym podkreśleniem __.

  • Pozwalają zmieniać zachowanie obiektów wbudowanych operatorów i funkcji Pythona.
  • Przykłady najczęściej używanych metod specjalnych:
Metoda Opis
__str__ Zwraca czytelny dla użytkownika opis obiektu (print, str)
__repr__ Zwraca „oficjalną” reprezentację obiektu (debugowanie)
__len__ Określa zachowanie funkcji len() dla obiektu
__add__ Definiuje zachowanie operatora +
__sub__ Definiuje zachowanie operatora -
__eq__ Definiuje zachowanie operatora ==
__lt__, __gt__ Definiuje porównania < i >

Przykład użycia __len__ i __str__:

Przykład __eq__ dla porównania obiektów:


3. Podsumowanie – polimorfizm

  • Polimorfizm metod: różne klasy mogą implementować metodę o tej samej nazwie, co pozwala używać wspólnego interfejsu.
  • Polimorfizm operatorów: przeciążanie operatorów umożliwia wykonywanie działań dostosowanych do własnych klas.
  • Metody specjalne (dunder methods): zapewniają integrację obiektów własnych klas z wbudowanymi funkcjami i operatorami Pythona.
  • Zaleta polimorfizmu: kod staje się elastyczny, modularny i łatwy do rozszerzania, a funkcje mogą działać na różnych typach obiektów, które implementują te same metody.