Kod

Zmienne globalne w Pythonie: jak działają i co robią

Zmienne globalne w Pythonie: jak działają i co robią / Skillbox Media

Naucz się tworzyć boty Telegramu i aplikacje internetowe na bezpłatnym kursie Pythona z ekspertem z „Sbera”

Dowiedz się więcej

Wprowadzenie zmiennych w Pythonie to jedno z pierwszych zadań, z jakimi spotykają się początkujący programiści. Na pierwszy rzut oka wszystko wydaje się oczywiste: tworzysz zmienną i jej używasz. Jednak w praktyce istnieje wiele typów zmiennych, a to zmienne globalne często sprawiają trudności. Zmienne te są często źródłem błędów.

W tym artykule zagłębimy się w temat zmiennych globalnych. Dowiesz się, czym są, dlaczego ich użycie może powodować nieoczekiwane rezultaty w programie i jak prawidłowo z nimi współdziałać. Aby ułatwić zrozumienie materiału, zalecamy wybranie odpowiedniego edytora kodu, zainstalowanie Pythona na komputerze i uruchamianie udostępnionych przykładów kodu podczas czytania.

Spis treści

  • Zmienne globalne to elementy dostępne z dowolnego miejsca w programie, co czyni je wyjątkowymi i potężnymi narzędziami. Można ich używać do przechowywania informacji, które powinny być dostępne przez cały czas wykonywania aplikacji. Korzystanie ze zmiennych globalnych wiąże się jednak z pewnym ryzykiem.

    Głównym zagrożeniem jest to, że mogą one prowadzić do nieprzewidywalnych konsekwencji, jeśli wiele fragmentów kodu spróbuje zmienić ich wartości jednocześnie. Może to powodować błędy, które trudno wyśledzić i naprawić. Ponadto zmienne globalne komplikują proces debugowania i testowania, ponieważ ich stan może zmienić się w dowolnym miejscu programu, utrudniając zrozumienie logiki kodu.

    Warto również zauważyć, że nadmierne używanie zmiennych globalnych może prowadzić do zmniejszenia czytelności i łatwości utrzymania kodu. Gdy zmienne są dostępne wszędzie, trudniej jest zrozumieć, gdzie i jak są używane. W rezultacie może to zwiększyć prawdopodobieństwo konfliktów i błędów, szczególnie w dużych projektach, w których pracuje wielu programistów.

  • Zmienne globalne mogą powodować zakłócenia w logice programu z kilku powodów. Po pierwsze, mogą prowadzić do niepożądanych konsekwencji, gdy różne fragmenty kodu zmieniają tę samą wartość, utrudniając śledzenie zmian i zrozumienie działania programu. Stwarza to ryzyko wprowadzenia błędów, które są trudne do zidentyfikowania i naprawienia.

    Po drugie, użycie zmiennych globalnych może utrudnić testowanie i debugowanie kodu. Gdy funkcje zależą od zmiennych zewnętrznych, ich zachowanie staje się mniej przewidywalne, a wszelkie testy przeprowadzane na tych funkcjach mogą dawać niekompletne wyniki, jeśli zmienne globalne znajdują się w nieoczekiwanym stanie.

    Co więcej, zmienne globalne mogą utrudniać zrozumienie kodu innym programistom. Gdy zmienne są dostępne z dowolnego miejsca w programie, ich użycie może prowadzić do nieporozumień, ponieważ nie zawsze jest oczywiste, skąd pochodzą i jak są modyfikowane. Zmniejsza to czytelność i sprawia, że ​​kod jest trudniejszy w utrzymaniu, szczególnie w dużych projektach.

    Dlatego, chociaż zmienne globalne mogą być wygodne w niektórych sytuacjach, ich użycie wymaga ostrożności i świadomości potencjalnych problemów, jakie mogą powodować w logice programu.

  • Praca ze zmiennymi w różnych zakresach jest ważnym aspektem programowania. Zakres określa, gdzie zmienna jest dostępna do użycia w kodzie. Istnieje kilka typów zakresów, w tym globalny i lokalny.

    Do zmiennych globalnych można uzyskać dostęp z dowolnego miejsca w programie, podczas gdy zmienne lokalne są tworzone w funkcjach lub blokach kodu i są w nich ograniczone. Oznacza to, że zmienna lokalna nie będzie dostępna poza swoją funkcją, co pomaga uniknąć konfliktów nazw i nieoczekiwanych błędów.

    Co więcej, niektóre języki programowania mają zakresy powiązane z klasami i obiektami. Zmienne zadeklarowane jako właściwości klasy są dostępne w instancji tej klasy, co pozwala na bardziej uporządkowaną organizację kodu.

    Ważne jest, aby zrozumieć, jak prawidłowo używać zmiennych w zależności od ich zakresu. To nie tylko upraszcza debugowanie, ale także sprawia, że ​​kod jest bardziej czytelny i łatwiejszy w zarządzaniu. Prawidłowe użycie zakresów pomaga tworzyć niezawodne programy, minimalizując prawdopodobieństwo błędów związanych z niewłaściwym dostępem do zmiennych.

  • Zarządzanie obiektami zmiennymi i proces ich ponownego przypisywania jest ważną częścią pracy z danymi w programowaniu. Obiekty zmienne, takie jak listy czy słowniki, można modyfikować bez konieczności ich ponownego tworzenia. Oznacza to, że możesz dodawać, usuwać lub zmieniać elementy w takich obiektach, i robić to bezpośrednio w miejscu ich utworzenia.

    Jeśli chodzi o ponowne przypisanie, ważne jest, aby zrozumieć, że ta czynność nie zmienia samego obiektu, a jedynie odwołanie do niego. Na przykład, jeśli przypiszesz nową wartość do zmiennej, stara wartość, na którą wskazywała, może pozostać niezmieniona, jeśli istnieją do niej inne odwołania. Może to prowadzić do nieporozumień, zwłaszcza jeśli pracujesz z wieloma zmiennymi, które odwołują się do tego samego obiektu zmiennego.

    Aby skutecznie zarządzać obiektami zmiennymi, ważne jest, aby zwracać uwagę na to, jak ich używasz i jakie odwołania przechowujesz. Podczas kopiowania obiektów pamiętaj, że proste przypisanie nie tworzy nowego obiektu, a jedynie tworzy nowe odwołanie do istniejącego. Aby tworzyć kopie, możesz użyć metod, które umożliwiają kopiowanie głębokie lub płytkie, w zależności od potrzeb.

    Dlatego ostrożne obchodzenie się z obiektami zmiennymi i zrozumienie specyfiki ponownego przypisania pomoże uniknąć błędów i sprawi, że kod będzie bardziej przewidywalny i zrozumiały.

  • Organizacja interakcji ze zmiennymi globalnymi między modułami wymaga uwzględnienia kilku ważnych aspektów. Po pierwsze, należy określić, które zmienne rzeczywiście powinny być globalne, aby uniknąć niepotrzebnego zaśmiecania przestrzeni nazw.

    Następnie, do każdego modułu, w którym planowane jest użycie tych zmiennych, należy je zaimportować. Jednym z powszechnych podejść jest utworzenie osobnego modułu zawierającego wszystkie zmienne globalne, a następnie zaimportowanie ich do innych modułów. Pozwala to na scentralizowane zarządzanie i ułatwia utrzymanie kodu.

    Co więcej, warto wziąć pod uwagę, że zmiana zmiennej globalnej w jednym module może wpłynąć na inne moduły, które również korzystają z tej zmiennej. Dlatego ważne jest monitorowanie zmian i ewentualnie stosowanie funkcji lub klas do kontrolowania dostępu do takich zmiennych, co może zmniejszyć ryzyko wystąpienia błędów.

    Dodatkowo, aby uniknąć konfliktów nazw, można użyć prefiksów lub innych konwencji nazewnictwa. Należy również rozważyć użycie stałych dla wartości, których nie należy się spodziewać, co może pomóc w poprawie czytelności i łatwości utrzymania kodu.

    Na koniec, organizując pracę ze zmiennymi globalnymi między modułami, należy postępować ostrożnie, starannie rozważając strukturę i metody interakcji, aby zachować przejrzystość i funkcjonalność kodu.

  • Najlepsze praktyki korzystania ze zmiennych globalnych.

Definicja zmiennych globalnych i ich potencjalne zagrożenia

Zmienna globalna to zmienna tworzona poza funkcjami lub klasami. Dostęp do niej jest możliwy z dowolnego miejsca w programie, ale aby zmienić jej wartość wewnątrz funkcji, należy użyć specjalnego słowa kluczowego. Zacznijmy od przykładu.

Zmienna komunikatu jest tworzona w zakresie globalnym, czyli poza jakąkolwiek funkcją. W ten sposób funkcja greet() może uzyskać dostęp do swojej wartości i wyświetlić ją na ekranie.

Zmienna zadeklarowana wewnątrz funkcji jest uważana za lokalną i jest dostępna tylko w obrębie tej funkcji. Po zakończeniu wykonywania funkcji taka zmienna jest automatycznie usuwana z pamięci, co pozwala zwolnić zajęte zasoby. Spróbuj sam:

Błędy mogą wystąpić, gdy zmienne lokalne i globalne mają te same nazwy. W Pythonie zmienna zadeklarowana wewnątrz funkcji jest postrzegana jako lokalna, nawet jeśli próbujesz uzyskać do niej dostęp przed jej przypisaniem. Przyjrzyjmy się przykładowi kodu, który spowoduje błąd UnboundLocalError.

Podczas analizy kodu funkcji, interpreter Pythona wyświetla jego podgląd w całości przed rozpoczęciem wykonywania. Podczas tego procesu, gdy napotka wiersz z przypisaniem count = 20, definiuje count jako zmienną lokalną, która będzie używana w całej funkcji.

Tak więc, gdy próbujesz print(count) przed przypisaniem wartości zmiennej count, Python uzyskuje dostęp do zmiennej lokalnej, która nie została jeszcze zainicjowana. Ostatecznie skutkuje to błędem UnboundLocalError.

Przeczytaj również:

Zmienne w języku programowania Python to nazwane lokalizacje pamięci służące do przechowywania danych. Umożliwiają one programistom zapisywanie informacji do późniejszego wykorzystania, dzięki czemu kod jest bardziej elastyczny i czytelny. W Pythonie zmienne mogą mieć różne typy danych, w tym liczby, ciągi znaków, listy, krotki i wiele innych.

W Pythonie istnieje kilka podstawowych typów zmiennych. Typy liczbowe obejmują liczby całkowite (int) i liczby zmiennoprzecinkowe (float). Ciągi znaków (str) służą do przechowywania informacji tekstowych. Listy (list) i krotki (tuple) to kolekcje, które mogą zawierać wiele elementów, ale różnią się zmiennością: listy można modyfikować, podczas gdy krotki pozostają niezmienione po utworzeniu. Warto również wspomnieć o zbiorach (set) i słownikach (dict), które służą odpowiednio do pracy z wartościami unikatowymi i parami klucz-wartość.

Podczas definiowania zmiennych ważne jest przestrzeganie pewnych zasad: nazwy zmiennych muszą zaczynać się od litery lub podkreślenia, nie mogą zawierać spacji ani znaków specjalnych i nie mogą pokrywać się z zastrzeżonymi słowami języka. Wygodnie i poprawnie jest wybierać nazwy odzwierciedlające istotę przechowywanych danych, co znacznie ułatwia czytanie i zrozumienie kodu.

Zagrożenia związane ze zmiennymi globalnymi dla logiki kodu programu

Oprócz niedociągnięć technicznych, stosowanie zmiennych globalnych prowadzi do powstawania ukrytych zależności między różnymi komponentami programu. Oznacza to, że dowolna funkcja może nieprzewidywalnie zmienić wartość takiej zmiennej, co z kolei wpływa na działanie innych funkcji i modułów. Na przykład mogą ulec zmianie warunki w instrukcji if, wyniki obliczeń lub kolejność operacji w innych częściach kodu.

W dużych projektach składających się z wielu funkcji i modułów problem zależności staje się szczególnie oczywisty. Gdy jedną zmienną można zarówno odczytać, jak i zmienić w różnych częściach kodu, programista musi stale być świadomy wszystkich możliwych miejsc, w których może to nastąpić, aby odpowiednio ocenić aktualny stan programu.

W podanym przykładzie obie funkcje opierają się na zmiennej globalnej processing_mode. Funkcja main() ustawia ją na 1, zakładając, że program będzie działał w trybie standardowym. Jednak po wywołaniu process_data() wartość ta jest zmieniana na 2. W rezultacie warunek w main() staje się false, ponieważ stan programu uległ zmianie.

Ukryte zależności stają się istotne w przypadku zmiennych zmiennych globalnych – tych, które podlegają zmianom podczas wykonywania programu. Do takich zmiennych należą na przykład liczniki wywołań funkcji, flagi odzwierciedlające stan systemu lub zmienne służące do przechowywania wyników pośrednich.

Jednak w przypadku korzystania ze stałych trudności związane z ukrytymi zależnościami nie występują. Na przykład stałe takie jak MAX_CONNECTIONS = 100 (oznaczająca maksymalną liczbę połączeń z serwerem) lub API_URL = «» (link do zewnętrznego API) są ustawiane jednorazowo w momencie uruchomienia aplikacji i pozostają niezmienione przez cały czas jej działania. Zazwyczaj są pisane wielkimi literami i umieszczane w osobnym module.

Zarządzanie zmiennymi w zakresach

Aby zapobiec konfliktom nazw zmiennych, ważne jest zrozumienie, jak działają zakresy — zestaw reguł określających, gdzie zmienne mogą być odczytywane lub modyfikowane. Podstawową zasadą jest to, że zmienna jest dostępna w miejscu, w którym została zadeklarowana, a także w zagnieżdżonych strukturach kodu.

Wróćmy do przykładu UnboundLocalError i poprawmy go. Aby zmodyfikować zmienną globalną w ciele funkcji, należy poprzedzić jej nazwę słowem kluczowym „global”. Informuje to interpreter Pythona, że ​​pracujemy ze zmienną globalną, a nie tworzymy nowej zmiennej lokalnej. Spójrzmy na przykład.

Python oferuje kilka sposobów zarządzania zakresem zmiennych, a instrukcja global jest tylko jednym z nich. Aby wchodzić w interakcje ze zmiennymi w zakresie zewnętrznym (ale nie globalnym) w funkcjach zagnieżdżonych, należy użyć słowa kluczowego nonlocal. To słowo kluczowe pozwala modyfikować zmienne zdefiniowane w funkcji nadrzędnej. Składnia słowa kluczowego nonlocal jest podobna do składni słowa kluczowego global: nonlocal variable_name.

Podczas pracy ze zmiennymi Python używa dobrze zdefiniowanego algorytmu znanego jako reguła LEGB. Ta notacja odzwierciedla różne poziomy widoczności zmiennych:

  • Zakres lokalny to część funkcji, która się w niej znajduje.
  • Zakres otaczający to zakres funkcji zewnętrznej, używany w przypadku funkcji zagnieżdżonych.
  • Zakres globalny to zakres ogólnego przeznaczenia modułu.
  • Wbudowany zakres Pythona obejmuje predefiniowane funkcje i wyjątki, takie jak len(), print(), str() i wiele innych.

Python sprawdza zakres sekwencyjnie: najpierw bada zakres lokalny, następnie przechodzi do zakresu zewnętrznego, następnie sprawdza zakres globalny, a na końcu konsultuje zakres wbudowany.

Zakresy zmiennych w Pythonie: interpreter przeszukuje od środka do zewnętrznych okręgów, aż znajdzie nazwęInfografika: Maya Malgina dla Skillbox Media

Sztuka pracy z obiektami zmiennymi i proces ponownego przypisywania

W przypadku obiektów zmiennych, takich jak listy, słowniki lub zbiory, można dostosować ich zawartość bez użycia słowa kluczowego global. Jest to możliwe, ponieważ nie zmieniamy samej zmiennej, ale pracujemy na danych wewnątrz obiektu, na który ona wskazuje. W Pythonie można wywoływać metody i modyfikować elementy tych obiektów bez konieczności jawnego oznaczania zmiennej jako globalnej.

Jeśli jednak zdecydujemy się przypisać nowy słownik do zmiennej konfiguracyjnej, użycie słowa kluczowego global stanie się konieczne.

Przeczytaj także:

Zestawy w Pythonie: podstawy dla początkujących

Zestawy to unikalny i potężny typ w Pythonie Zestawy danych, które umożliwiają przechowywanie kolekcji elementów bez duplikacji. Idealnie nadają się do zadań, w których ważne są unikalne wartości. Przyjrzyjmy się bliżej, czym są zestawy i jak z nimi pracować.

Zestaw tworzy się za pomocą nawiasów klamrowych lub funkcji `set()`. Na przykład, aby utworzyć zestaw kilku liczb, można użyć następującego kodu:

«`python
my_set = {1, 2, 3, 4}
«`

Lub używając funkcji:

«`python
my_set = set([1, 2, 3, 4])
«`

Elementy zestawu są automatycznie porządkowane, a duplikaty są wykluczane. Na przykład, jeśli spróbujesz utworzyć zestaw z duplikatami wartości, Python po prostu zignoruje duplikaty:

«`python
my_set = {1, 2, 2, 3}
print(my_set) # Wynik: {1, 2, 3}
«`

Jedną z podstawowych operacji na zestawach jest dodawanie nowych elementów za pomocą metody `add()`. Możesz dodawać elementy pojedynczo:

«`python
my_set.add(5)
«`

Aby usunąć element, użyj metody `remove()`, która usuwa określony element, ale zgłasza błąd, jeśli element nie istnieje. Jeśli chcesz uniknąć błędów, możesz użyć metody `discard()`, która po prostu nic nie zrobi, jeśli elementu brakuje:

«`python
my_set.remove(2) # Usuwa 2
my_set.discard(4) # Nie zgłasza błędu, jeśli brakuje 4
«`

Zbiory obsługują również operacje matematyczne, takie jak suma, iloczyn i różnica. Na przykład, aby połączyć dwa zbiory, możesz użyć operatora `|` lub metody `union()`:

«`python
set_a = {1, 2, 3}
set_b = {3, 4, 5}
union_set = set_a | set_b # {1, 2, 3, 4, 5}
«`

Przecięcie można uzyskać za pomocą operatora `&` lub metody `intersection()`:

«`python
intersection_set = set_a & set_b # {3}
«`

Różnicę zbiorów implementuje się za pomocą operatora `-` lub metody `difference()`:

«`python
difference_set = set_a — set_b # {1, 2}
«`

Zbiory w Pythonie stanowią zatem wygodne narzędzie do pracy z unikatowymi danymi i wykonywania różnych operacji na kolekcjach. Ich użycie może znacznie uprościć rozwiązywanie wielu problemów programistycznych.

Efektywne strategie pracy ze zmiennymi globalnymi w środowisku wielomodułowym

W rzeczywistych projektach kod jest zazwyczaj podzielony na moduły, co często implikuje konieczność użycia tej samej zmiennej globalnej w różnych plikach. Najprostszym sposobem rozwiązania tego problemu jest utworzenie osobnego modułu do przechowywania zmiennych globalnych. Nazwijmy ten moduł settings.py.

Teraz możesz przenosić te zmienne do innych modułów za pomocą polecenia import i uzyskiwać do nich dostęp, określając nazwę odpowiedniego modułu.

Aby wprowadzić zmiany w zmiennej globalnej znajdującej się w innym module, musisz użyć jej nazwy wraz ze specyfikacją modułu.

Używając konstrukcji from settings import DEBUG_MODE, nie otrzymujesz odwołania do zmiennej w module ustawień, lecz jej kopię. Oznacza to, że wszelkie zmiany wprowadzone w tej zmiennej w bieżącym module spowodują utworzenie jej wersji lokalnej bez wpływu na oryginalną wartość w pliku settings.py.

Ten wyjątek dotyczy obiektów zmiennych — w takich przypadkach importy bezpośrednie są dozwolone, ponieważ zmieniamy dane w obiekcie, a nie redefiniujemy zmiennej.

W powyższym przykładzie zmienna globalna users jest reprezentowana jako lista, która jest obiektem zmiennym. Kiedy importujemy użytkowników za pomocą polecenia from settings import users, Python przekazuje odwołanie do tego obiektu, a nie jego kopię. Oznacza to, że wykonanie users.append(«editor») zmienia zawartość listy w module ustawień, ale nie tworzy nowej zmiennej. Jeśli jednak spróbujemy przypisać zmiennej nową wartość (na przykład users = [«editor»]), Python utworzy nową zmienną lokalną, pozostawiając oryginalną listę niezmienioną.

Przeczytaj także:

Listy w Pythonie: czym są i jak z nimi współdziałać

Listy w Pythonie to uporządkowane kolekcje, które pozwalają przechowywać wiele elementów. Mogą zawierać elementy różnych typów, w tym liczby, ciągi znaków, a nawet inne listy. Jedną z kluczowych cech list jest ich zmienność, co oznacza, że ​​można dodawać, usuwać lub modyfikować elementy po ich utworzeniu.

Listę tworzy się, umieszczając elementy w nawiasach kwadratowych i oddzielając je przecinkami. Na przykład lista liczb może wyglądać tak: [1, 2, 3, 4]. Aby uzyskać dostęp do elementu na liście, należy użyć jego indeksu, który zaczyna się od zera. Dlatego, aby uzyskać dostęp do pierwszego elementu na liście, należy podać indeks 0.

Listy oferują wiele metod pracy z danymi. Na przykład metoda append() pozwala dodać nowy element na końcu listy, a metoda remove() usuwa określony element. Można również użyć metody sort(), aby posortować elementy w kolejności rosnącej.

Co więcej, listy obsługują operacje wycinania, które pozwalają na pobieranie podzbiorów elementów. Wycinanie ułatwia uzyskiwanie określonych zakresów wartości, co czyni pracę z listami jeszcze bardziej elastyczną.

Dlatego listy w Pythonie są potężnym narzędziem do przechowywania i zarządzania danymi, zapewniając wygodny i intuicyjny interfejs do wykonywania różnych operacji.

Innym sposobem jest użycie funkcji do pracy ze zmiennymi globalnymi. Te zmienne zazwyczaj noszą nazwę „private” i zaczynają się od znaku podkreślenia, na przykład _debug_mode.

Chociaż nie czyni to zmiennej prywatną, ponieważ Python nie ogranicza do niej dostępu, taka nazwa stanowi sygnał dla programistów: zmiany w zmiennej powinny być wprowadzane wyłącznie za pomocą funkcji, a nie bezpośrednio.

Zmienna _debug_mode znajduje się w pliku settings.py, a funkcje is_debug() i set_debug() zapewniają do niej uporządkowany dostęp. Ta metoda chroni dane globalne przed niezamierzonymi zmianami i upraszcza proces debugowania, ponieważ cała logika aktualizacji jest skoncentrowana w jednym miejscu.

Na przykład, jeśli chcesz zaimplementować rejestrowanie lub weryfikację zmiany wartości _debug_mode, wystarczy wprowadzić zmiany w funkcji set_debug(). Wyeliminuje to konieczność przeglądania wszystkich sekcji kodu, w których zmienna mogłaby zostać zmieniona bezpośrednio.

Przeczytaj także:

Funkcje w Pythonie: Kompletny przewodnik

Podstawowe wskazówki dotyczące efektywnego wykorzystania funkcji globalnych Zmienne

Chociaż użycie zmiennych globalnych może prowadzić do różnych problemów, czasami ich użycie staje się konieczne. Na przykład, takie zmienne mogą być bardzo wygodne do przechowywania ustawień lub dostępu do współdzielonych zasobów. Jeśli nadal musisz ich używać, postępuj zgodnie z poniższymi wskazówkami, aby uniknąć typowych błędów.

Zaleca się używanie prefiksu g_ przed nazwami zmiennych globalnych. Takie podejście pozwala programistom natychmiast zidentyfikować, że dana zmienna należy do zakresu globalnego, co wymaga szczególnej ostrożności podczas jej używania.

Zaleca się przekazywanie zmiennych globalnych jako argumentów funkcji. Zamiast bezpośredniego dostępu do zmiennych globalnych, lepiej jest przekazać ich wartości za pośrednictwem parametrów. Dzięki temu zależności są bardziej przejrzyste, proces testowania jest łatwiejszy, a kod jest łatwiejszy do ponownego wykorzystania.

Staraj się minimalizować użycie zmiennych zmiennych globalnych. Używaj ich przede wszystkim do przechowywania stałych, parametrów konfiguracyjnych, obiektów pojedynczych instancji, liczników i flag – tylko w przypadkach, gdy alternatywne podejścia są zbędne.

W innych przypadkach warto rozważyć inne metody: przekazywanie argumentów przez funkcje, używanie klas lub menedżerów kontekstu. Na przykład, zamiast polegać na globalnym liczniku żądań, który można modyfikować z różnych części kodu, lepiej jest użyć klasy.

Zamiast używać zmiennej globalnej, tworzymy klasę RequestCounter, która konsoliduje stan licznika i zapewnia kontrolowany dostęp za pomocą metody increment(). Takie podejście pozwala każdej części programu mieć własny licznik – informacje są izolowane, co zapobiega nieprzewidywalnym zmianom współdzielonego stanu przez różne moduły.

Co więcej, ta metoda upraszcza proces testowania. Możesz zainicjować nową instancję RequestCounter dla każdego testu osobno, nie martwiąc się o możliwe skutki uboczne ze strony innych komponentów kodu. Jeśli zajdzie potrzeba dodania logowania lub walidacji podczas zwiększania licznika, wystarczy wprowadzić zmiany w metodzie increment() — cała niezbędna logika pozostanie skoncentrowana w jednym miejscu.

Przeczytaj także:

Krótki kurs programowania obiektowego w Pythonie: jak uniknąć zamieszania w kodzie.

Dowiedz się więcej ciekawych informacji o programowaniu w Nasz kanał Telegram. Dołącz do nas!

Czytaj także:

  • Naucz się Pythona samodzielnie bez wydawania pieniędzy: przewodnik krok po kroku.
  • Podstawy pracy z typami danych w Pythonie dla początkujących: czym są i jak ich używać.
  • Operatory odgrywają ważną rolę w Pythonie, ponieważ pozwalają wykonywać różne operacje na danych. Są to specjalne symbole lub kombinacje symboli, które wykonują określone czynności, takie jak obliczenia, porównania i manipulacja danymi.

    Istnieje kilka kategorii operatorów, z których każda służy swojemu celowi.

    1. Operatory arytmetyczne służą do wykonywania obliczeń matematycznych. Należą do nich takie operacje, jak dodawanie, odejmowanie, mnożenie i dzielenie.

    2. Operatory porównania służą do porównywania wartości. Pozwalają one określić, czy dwie wartości są równe, czy jedna jest większa od drugiej itd.

    3. Operatory logiczne pomagają w pracy z wartościami boolowskimi, umożliwiając łączenie wielu wyrażeń logicznych.

    4. Operatory bitowe manipulują pojedynczymi bitami liczb, co jest przydatne w przypadku niektórych zadań niskiego poziomu.

    5. Operatory przypisania służą do ustawiania wartości zmiennych, umożliwiając nie tylko przypisywanie, ale także zmianę wartości za pomocą innych operatorów.

    6. Operatory tożsamości pozwalają sprawdzić, czy obiekt odnosi się do tego samego elementu w pamięci.

    7. Operatory przynależności sprawdzają, czy dana wartość znajduje się w sekwencji, takiej jak lista lub ciąg znaków.

    Każdy z tych typów operatorów ma swoje własne cechy i zasady użycia, co czyni Pythona potężnym narzędziem programistycznym.