Dodatek 2: funkcje specjalne w klasach¶
Na lekcji 4 dowiedzieliście się jak budować klasy, poznaliście jak zainicjalizować
obiekt danej klasy oraz co to są metody instancji. Wspomnieliśmy też o dziwnych
funkcjach - tych, które zaczynają, bądź kończą się jednym, bądź dwoma znakami podłogi.
Te z nich, które zaczynają i kończą się dwoma, np __init__
nazywane są funkcjami
(lub metodami) specjalnymi. Dwie z nich już znasz
__init__
- wywoływana jest przy tworzeniu instancji,__str__
- wywoływana przy przekazywaniu obiektu do instrukcjiprint
. Tworzy ona reprezentację obiektu w typiestr
.
Nie będziemy tutaj opisywać wszystkich tych funkcji. Zamiast tego postaramy się pokazać na przykładzie jak je wykorzystać, by tworzyć nieco bardziej intuicyjne typy danch za pomocą klas. Jeżeli interesują cię one wszystkie odsyłamy do dokumentacji języka Python.
Jednym z zadań do lekcji 4 było skonstruowanie klasy opisującej wektory na płaszczyźnie. Tam mieliśmy poznać dziedziczenie. Tutaj zajmiemy się zagadnieniem metod specjalnych. Zaczniemy od konstrukcji samej klasy, tak by realizowała dodawanie i odejmowanie wektorów
Aby teraz dodać/odjąć dwa wektory musimy użyć metod dodaj
lub odejmij
, tak jak
widać to w powyższym ActiveCode. Bardziej naturalną metodą było by natomiast użycie
operatora +
lub -
, pisząc
w3 = w1 + w2
w4 = w1 - w2
Aby to osiągnąć posłużymy się właśnie funkcjami specjalnymi. Jedną będzie __add__
,
która odpowiada za implementację operatora +
w danej klasie oraz __sub__
, która
definiuje zachowanie operatora -
. W zasadzie wystarczy stare funkcje zastąpić
tymi specjalnymi.
To własnie takie proste. Poeksperymentuj z innymi funkcjami. Jak masz ochotę, możesz też zrobić zadanie...
Zadanie
Wektory można porównywać, np. jeden może być dłuższy od drugiego. Oprogramuj zachowanie
się operatorów porównania >, <, >=, <=, ==, !=
. Poczytaj też o funkcji __repr__
.
Czym różni się ona od __str__
?