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_dzwiekdział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 klasyPunkt. - Wywołanie
p1 + p2korzysta 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.