W Pythonie deskryptory i atrybuty kontrolowane wyjaśniają, jak lepiej zarządzać obiektami

W Pythonie deskryptory i atrybuty kontrolowane wyjaśniają, jak lepiej zarządzać obiektami
2 min de lecture

Deskryptory w Pythonie pozwalają kontrolować, co się dzieje podczas odczytu, modyfikacji lub usuwania atrybutu obiektu. Samouczek szczegółowo opisuje, jak ich używać do tworzenia trzech typów atrybutów kontrolowanych: walidowanych, obliczanych i ładowanych na żądanie. Ilustruje to podejście na fikcyjnym przykładzie aplikacji turystycznej w Japonii.

Deskryptor to klasa implementująca metody takie jak __get__, __set__ lub __delete__, które definiują zachowanie atrybutu. Nie wszystkie są obowiązkowe. Metoda __set_name__, wprowadzona w Pythonie 3.6, informuje deskryptor o nazwie atrybutu, z którym jest powiązany, co pozwala przechowywać wartość w __dict__ obiektu nadrzędnego bez kolizji nazw. Zdaniem autora, to podejście pozwala uniknąć zaśmiecania kodu dekoratorami @property, getterami i setterami.

Atrybuty walidowane, obliczane lub leniwe

Pierwszy przykład, nazwany ValidatedRating, sprawdza, czy ocena jest liczbą (całkowitą lub dziesiętną) mieszczącą się między wartością minimalną a maksymalną, domyślnie ustawionymi na 1.0 i 5.0. W przypadku wartości nieliczbowej zgłasza TypeError; jeśli wartość jest poza zakresem, zgłasza ValueError.

Drugi, ComputedUSDPrice, służy do wyświetlania w dolarach amerykańskich ceny przechowywanej w jenach japońskich (JPY). Oblicza konwersję w locie, przy użyciu kursu wymiany 0.0067, podanego w kodzie jako przybliżenie. Ponieważ atrybut jest tylko do odczytu, każda próba zapisu wywołuje AttributeError.

Trzeci, LazyItinerary, dotyczy danych kosztownych w generowaniu, takich jak odczyt dużego pliku JSON lub zapytanie do bazy danych rozkładów Shinkansen, japońskich pociągów dużych prędkości. Deskryptor oblicza wartość tylko przy pierwszym odwołaniu, umieszcza ją w __dict__ instancji, a następnie się wycofuje. Kolejne odwołania odczytują tę wartość bezpośrednio. W przykładzie uwzględniono symulację opóźnienia wynoszącą jedną sekundę.

Praktyczne zastosowanie podczas wizyty w Kioto

Te trzy deskryptory są połączone w klasie JapanTour. Podczas inicjalizacji z przeznaczeniem „Kyoto », ceną 45000 JPY i oceną 4.8, walidacja jest uruchamiana natychmiast. Gdy autor próbuje następnie przypisać ocenie wartość 6.0, wyjątek jest przechwytywany i wyświetlany jest komunikat „rating must be between 1.0 and 5.0. ».

Pierwsze odwołanie do itinerarza wyświetla komunikat symulacji zapytania, a następnie trzy dni programu: przyjazd i zameldowanie w Kioto, zwiedzanie świątyń z przewodnikiem i degustacja street food, a następnie wyjazd Shinkansenem. Przy drugim odwołaniu komunikat już się nie pojawia: wartość jest odczytywana bezpośrednio z instancji.

Artykuł podsumowuje, że te trzy typy deskryptorów wzmacniają solidność atrybutów klasy, zapewniając odpowiednio integralność danych, obliczanie wartości pochodnych i zarządzanie kosztownymi operacjami.