magiczne metody w Pythonie na przykładzie

Zdjęcie dzięki uprzejmości www..com

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.

How to call the magic methods, getitem, setitem and delitem

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.

__mul__ jest metodą z klasy mycustomlist. Tutaj jest pokazany w izolacji.

operator mnożenia * powoduje wywołanie metody magicznej __MUL__, które możemy dostosować tak, aby zwracało pożądane przez nas zachowanie.

cały kod źródłowy klasy użytej w tym przykładzie, MyCustomList jest pokazany poniżej:

przykładowy Bonus: Metoda__ call __magic

aby zakończyć, zilustruję, jak można wywołać metodę__ call _ _ magic w Pythonie. __call__ może być szczególnie przydatna w klasach z instancjami, które często muszą zmieniać swój stan. „Wywołanie” instancji może być intuicyjnym i eleganckim sposobem zmiany stanu obiektu.

rozważ pokazany przykład. Tutaj Klasa MyClass ma konstruktor init, który oczekuje podania trzech argumentów. Te trzy argumenty można przekazać w podpisie metody init i przypisać jako atrybuty w obiekcie.

metoda call magic jest przydatna, gdy chcemy zmienić stan instancji, bez tworzenia nowej instancji.

gdy instancja jest inicjalizowana po raz pierwszy, przekazuję liczby całkowite 1, 2 i 3, które są przypisane jako atrybuty var_1, var_2 i var_3 w instancji odpowiednio. Kiedy używam instrukcji print do pokazania wyjścia instancji, obj, za pomocą atrybutu _ _ dict__, widzę, że var_1 ma przypisaną wartość 1, var_2 ma przypisaną wartość 2, a var_3 ma przypisaną wartość 3.

teraz zaproponujmy, że chciałbym zmienić wartości atrybutów var_1 i var_2 tej instancji, zachowując atrybut var_3 taki, jaki był, gdy instancja była pierwotnie skonstruowana.

aby to zrobić, jest to proste. Definiuję metodę call magic, która pozwala na ponowne zdefiniowanie atrybutów var_1 i var_2. Metody magiczne mogą być wywoływane niejawnie, co oznacza, że po prostu wywołuję obj (200, 300), a metoda call zostanie wywołana. Oczywiście możliwe jest również jawne wywołanie metody call, np. obj.__ call _ _ (200, 300), ale pierwsza metoda wydaje się bardziej intuicyjna. Na koniec, dla celów demonstracyjnych, wydrukowałem identyfikator instancji, aby zdecydowanie pokazać, że manipulowaliśmy tym samym obiektem.

metodę call można zdefiniować na dwa sposoby. Argumenty mogą być przekazywane bezpośrednio do podpisu metody wywołania. Alternatywnie można użyć argumentu * vars, który przechwytuje wszystkie przekazane argumenty i przechowuje je w krotce, którą można rozpakować jak pokazano powyżej.

kod źródłowy tego przykładu można znaleźć poniżej.

podsumowanie

magiczne metody mogą wzbogacić nasz projekt klasy, dając nam dostęp do podstawowych funkcji składni. W pierwszych przykładach mamy to, co najlepsze z obu światów. Możemy dziedziczyć po wbudowanej klasie list i modyfikować poszczególne metody w tej klasie, aby dostosować zachowanie. getitem, setitem i delitem zostały zmodyfikowane, ale dzięki dziedziczeniu nadal mogliśmy korzystać na przykład z wbudowanych w listę metod INIT i repr ().

możemy bardzo łatwo komunikować korzystanie z obiektów innym programistom. W podanym przykładzie wszystko, co musimy powiedzieć naszym kolegom programistom, to to, że nasza klasa działa jak lista, tylko trochę inaczej, tutaj odrzucamy ideę indeksu zera. Nie ma potrzeby poznawania nowych nazw metod ani nowego interfejsu.

dodatkowo wykazano metodę Call magic. Wywołanie instancji może być intuicyjnym i eleganckim sposobem zmiany stanu obiektu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.