Jak działa dekorator @property w Pythonie i do czego jest używany?

Dekorator @property w Pythonie to potężne narzędzie, które pozwala na bardziej eleganckie i bezpieczne zarządzanie dostępem do atrybutów klasy. Pozwala ono programistom na definiowanie metod w klasie, które można wywołać jak atrybuty, a tym samym kontrolować dostęp do nich, nie zmieniając interfejsu klasy. W ten sposób można łatwo zaimplementować tzw. “gettery” i “settery”, które są metodami służącymi do pobierania i ustawiania wartości atrybutów, z dodatkową logiką walidacji lub obliczeniową.

Przykład użycia dekoratora @property

Zacznijmy od prostego przykładu klasy reprezentującej konto bankowe, które pozwala na kontrolę nad zmianą balansu poprzez dodanie walidacji przy próbie ustawienia nowej wartości balansu. Zastosowanie dekoratora @property pozwala na bezpieczne zarządzanie atrybutami instancji, zwiększając czytelność kodu i unikając bezpośredniego dostępu do nich.

class BankAccount:
    def __init__(self, initial_balance=0):
        # Ustawienie początkowego balansu konta,
        # przy użyciu metody setter.
        self.balance = initial_balance

    @property
    def balance(self):
        # Getter dla balansu, pozwala na bezpieczne
        # pobranie wartości balansu
        return self._balance

    @balance.setter
    def balance(self, value):
        # Setter dla balansu, pozwala na bezpieczne
        # ustawienie wartości balansu z dodatkową
        # walidacją
        if not isinstance(value, (int, float)):
            raise ValueError("Balans musi być liczbą")
        if value < 0:
            raise ValueError("Balans nie może być ujemny")
        self._balance = value

# Użycie klasy z dekoratorem @property
account = BankAccount(100)
print("Początkowy balans:", account.balance)
# Próba ustawienia nowego balansu
account.balance = 200
print("Nowy balans:", account.balance)
# Próba ustawienia nieprawidłowego balansu
try:
    account.balance = -50
except ValueError as e:
    print(e)

Działanie kodu

W powyższym przykładzie klasa BankAccount zawiera prywatny atrybut _balance, do którego dostęp jest możliwy tylko poprzez zdefiniowane metody getter (@property) i setter (@balance.setter). Dzięki temu, przy próbie zmiany balansu, można wprowadzić dodatkową logikę walidacyjną, jak sprawdzenie, czy nowa wartość balansu jest liczbą i czy nie jest wartością ujemną. To zapewnia większe bezpieczeństwo danych i pozwala na łatwe śledzenie oraz debugowanie kodu, gdyż wszelkie operacje na atrybucie balance muszą przejść przez zdefiniowane metody.

Podsumowanie

Dekorator @property w Pythonie stanowi skuteczne narzędzie do tworzenia interfejsów do atrybutów klasy, które wymagają dodatkowej logiki przy ich odczycie lub zmianie. Umożliwia tworzenie kodu, który jest nie tylko bezpieczny i łatwy w utrzymaniu, ale również czytelny i elegancki. Poprzez kontrolowanie dostępu do atrybutów klasy, dekorator @property pomaga w zachowaniu integralności danych oraz ułatwia zarządzanie stanem obiektów.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs Python od podstaw w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top