Zmiana wbudowanego zachowania przy użyciu metod magicznych
metody magiczne to specjalne metody, które można zdefiniować, aby dodać 'magię’ do swoich klas. Są one zawsze otoczone podwójnymi podkreślnikami, na przykład metodami__ init __i__ str _ _ magic. Magiczne metody mogą wzbogacić naszą klasę, dając nam dostęp do wbudowanych funkcji składni Pythona.
Python pozwala naszym klasom dziedziczyć po klasach wbudowanych. Dziedzicząca Klasa potomna wbudowanego posiada wszystkie te same atrybuty, w tym metody, które są wbudowane. Możemy skorzystać z podstawowej wbudowanej funkcjonalności, ale dostosować wybrane operacje za pomocą magicznych metod.
w tym tutorialu połączę te dwa pomysły, aby pokazać, w jaki sposób możemy dziedziczyć po wbudowanej klasie list i wykorzystywać magiczne metody w projektowaniu naszej klasy. Zmodyfikuję trzy magiczne metody, które kontrolują indeksowanie listy. Łącząc obie te cechy, można zbudować klasę, która jest bardzo prosta w użyciu i możemy dodać zachowanie do metod, których pragniemy. Wbudowane zachowanie jest znane wszystkim programistom Pythona; to z kolei sprawia, że korzystanie z naszej klasy dziedziczenia jest łatwe do nauczenia.
na koniec zaprezentowane zostaną dwa szersze przykłady ilustrujące, w jaki sposób magiczne metody mogą być stosowane w operacjach rozgłoszeniowych i zmieniających stan instancji. Cały kod towarzyszący jest dostępny poprzez GitHub.
przykład 1: Indeksowanie List
magiczne metody mogą być manipulowane w celu modyfikacji indeksowania list. Klasa MyCustomList dziedziczy po wbudowanym typie listy. Oznacza to, że każdy obiekt utworzony za pomocą klasy MyCustomList będzie zachowywał się jak lista, z wyjątkiem miejsc, w których wybieramy selektywne dostosowywanie metod.
getitem, setitem i delitem to magiczne metody, które są wywoływane podczas dostępu do indeksu listy. Zachowanie tych magicznych metod można modyfikować.
w poniższym przykładzie odrzucamy ideę indeksowania list rozpoczynającego się od indeksu zera. Jeśli użytkownik spróbuje uzyskać dostęp do elementu z naszej listy za pomocą indeksu zeroth, zostanie wywołany wyjątek ValueError i program zakończy działanie. Jeśli użytkownik wprowadzi indeks listy większy niż jeden, metody zmniejszą Indeks o jeden, a następnie wywołają listę klas nadrzędnych z indeksem.
aby pokazać, w jaki sposób używane są te metody zdefiniowane w klasie MyCustomList, zobacz poniżej w interaktywnym monicie Pythona.
przykład pokazuje jak można wywołać getitem, SetItem i delitem. Metody magiczne można nazwać niejawnie. Dla _ _ getitem__, aby uzyskać dostęp do pierwszego indeksu, wystarczy wpisać nazwę obiektu, po której następuje pozycja indeksu w nawiasach kwadratowych.
najciekawsze jest to, że gdy zapytamy o element na pozycji indeksu 1, zwracana jest wartość całkowita 1, mimo że 1 jest elementem zerowym. Mamy tutaj listę, która zaczyna indeksowanie od 1. W rzeczywistości nadrabia to zamieszanie, które wszyscy mieliśmy, gdy po raz pierwszy nauczyliśmy się indeksowania list.
teraz zmieńmy liczbę całkowitą 1 na liście na 100. Aby to zrobić, musimy powołać się na setitem. Aby to zrobić, po prostu piszemy nazwę obiektu, a następnie nawiasy kwadratowe i przypisanie. Ponownie, aby zmienić pierwszy element na liście, używamy pozycji indeksu 1. Kiedy wypisujemy listę ponownie, możemy wyraźnie zobaczyć, że pierwszy element zmienił się z 1 do 100.
wreszcie, aby usunąć element z listy __delitem__ można zdefiniować. Metoda__ delitem _ _ magic jest wywoływana, gdy używamy słowa kluczowego del python, które rozwiązuje wywołanie metody _ _ delitem__. Aby dalej budować na naszym przykładzie indeksowania listy, usuńmy pierwszy element w indeksie, wartość całkowitą 100. Kiedy wywołujemy del, po którym następuje obiekt i pozycja indeksu elementu, który chcemy usunąć, w tym przykładzie pierwszy element z listy 100, możemy teraz zobaczyć, że 100 W rzeczywistości zostało usunięte!
magiczne metody dają możliwość modyfikacji domyślnego zachowania. Co najlepsze, nie ma potrzeby uczenia się nowych nazw metod ani nowego interfejsu, więc metody mogą być intuicyjnie zaimplementowane. Przewodnik po użyciu tych magicznych metod zaimplementowanych w MyCustomList znajduje się w poniższej tabeli.
Example 2: Metodą__ mul _ _ magic
możemy również wykorzystać operator mnożenia w naszej klasie. Ponieważ dziedziczymy po wbudowanej klasie list, możemy spakować dwa obiekty MyCustomList razem (ponieważ działają one jak obiekty list) i iterację poprzez obiekt zip. Podczas iteracji możemy w sposób transmitowany mnożyć elementy z każdej listy przez odpowiadający jej element z drugiej listy (patrz fragment kodu metody magicznej __mul__ magic poniżej). To zachowanie transmisji jest podobne do tego występującego w pakietach do analizy danych, takich jak pandy i Numpy.
przykład pokazuje, że możemy połączyć dwa obiekty MyCustomList za pomocą znaku*. Jeśli przechwycimy zwróconą wartość w zmiennej o nazwie list_three i wydrukujemy list_three, zostanie wyświetlona nowa lista. Lista ta jest iloczynem mnożenia elementów względem siebie z pozostałych 2 List.
cały kod źródłowy klasy użytej w tym przykładzie, MyCustomList jest pokazany poniżej: