0Pricing
Python Academy · Lekcja

Dekorator @property

Proszę używać property do tworzenia getterów, setterów i deleterów.

Dekorator @property to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Wprowadzenie

@property zamienia metodę w czytelny atrybut. @setter i @deleter uzupełniają wzorzec kontrolowanego dostępu.

Dlaczego @property?

Zamiast metod getX()/setX() w stylu Javy Python używa @property. Dostęp wygląda jak dostęp do atrybutu: obj.value, a nie obj.get_value().
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
c = Circle(5)
print(c.radius)  # no ()

Właściwości obliczane

Metody oznaczone @property wykonują obliczenia na bieżąco. obj.area jest obliczane przy każdym odczycie — nie trzeba przechowywać wartości.
import math
class Circle:
    def __init__(self, r): self._r = r
    @property
    def area(self): return math.pi * self._r**2
c = Circle(5)
print(round(c.area, 2))

Setter właściwości

property_name.setter dodaje setter. Teraz c.radius = 10 wywołuje metodę setter.
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
    @radius.setter
    def radius(self, val):
        if val <= 0: raise ValueError('radius must be positive')
        self._r = val
c = Circle(5)
c.radius = 10
print(c.radius)

Deleter właściwości

property_name.deleter obsługuje del obj.attr. Należy go używać do logiki sprzątania.
class User:
    def __init__(self, name): self._name = name
    @property
    def name(self): return self._name
    @name.deleter
    def name(self): del self._name
u = User('Alice')
del u.name
print(hasattr(u, '_name'))

Właściwość tylko do odczytu

Należy zdefiniować wyłącznie getter, bez settera. Próba przypisania wartości wywoła AttributeError.
class Const:
    def __init__(self, v): self._v = v
    @property
    def value(self): return self._v
c = Const(42)
print(c.value)
try: c.value = 99
except AttributeError as e: print(e)

Właściwość z walidacją

Settery są idealnym miejscem do walidowania danych — przed zapisaniem można sprawdzić typ, zakres lub format.
class BoundedInt:
    def __init__(self, lo, hi): self.lo,self.hi=lo,hi; self._v=lo
    @property
    def value(self): return self._v
    @value.setter
    def value(self, v):
        if not self.lo <= v <= self.hi:
            raise ValueError(f'{v} out of [{self.lo},{self.hi}]')
        self._v = v
b = BoundedInt(0, 10)
b.value = 5
print(b.value)

Buforowanie za pomocą property

Połączenie @property z buforowaną wartością pozwala wykonać obliczenia raz i zapamiętać wynik.
class Expensive:
    _cache = None
    @property
    def result(self):
        if self._cache is None:
            self._cache = sum(range(1000))
        return self._cache
e = Expensive()
print(e.result)
print(e.result)

cached_property (Python 3.8+)

@functools.cached_property oblicza właściwość raz i przechowuje ją jako atrybut instancji — bez powtarzania obliczeń.
from functools import cached_property
import math
class Circle:
    def __init__(self, r): self.r = r
    @cached_property
    def area(self): return math.pi * self.r**2
c = Circle(5)
print(round(c.area, 2))

property a __slots__

__slots__ zapobiega tworzeniu dowolnych atrybutów i oszczędza pamięć. Właściwości dodają logikę. Oba mechanizmy dobrze się uzupełniają.
class Point:
    __slots__ = ('_x', '_y')
    def __init__(self, x, y): self._x,self._y=x,y
    @property
    def x(self): return self._x
p = Point(1, 2)
print(p.x)

Kiedy używać @property

Należy używać @property, gdy potrzebne są: walidacja, wartości obliczane lub zachowanie zgodności wstecznej przy zmianie implementacji wewnętrznej.
# Before: class Person:
#     def __init__(self, age): self.age = age
# After: add validation without changing caller code
class Person:
    def __init__(self, age): self.age = age
    @property
    def age(self): return self._age
    @age.setter
    def age(self, v):
        if v < 0: raise ValueError('negative age')
        self._age = v
p = Person(30)
print(p.age)

Szybkie sprawdzenie

Co się dzieje podczas próby przypisania wartości do właściwości tylko do odczytu @property, dla której nie zdefiniowano settera?

Podsumowanie

@property: getter staje się dostępem do atrybutu. @name.setter dodaje obsługę zapisu. @name.deleter dodaje obsługę del. @cached_property oblicza wartość raz. Settery służą do walidacji.

Proszę kontynuować

Doskonale Państwu idzie! Proszę kontynuować naukę, aby opanować kolejne zagadnienie.

Często zadawane pytania

Czy lekcja „Dekorator @property” jest bezpłatna?

Tak — pełny tekst „Dekorator @property” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Dekorator @property”?

Proszę używać property do tworzenia getterów, setterów i deleterów. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Dekorator @property”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje jako obiekty pierwszej klasy
  2. Pisanie własnych dekoratorów
  3. Dekorator @property
  4. @classmethod i @staticmethod
← Powrót do Python Academy