0Pricing
Python Academy · Урок

Декоратор @property

Используйте property для геттеров, сеттеров и методов удаления.

«Декоратор @property» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

@property превращает метод в атрибут, доступный для чтения. @setter и @deleter завершают шаблон управляемого доступа.

Зачем нужен @property

Вместо Java-подобных getX()/setX() в Python используется @property. Доступ выглядит как обращение к атрибуту: obj.value, а не 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 ()

Вычисляемые свойства

Методы с @property вычисляют значение на лету. obj.area выполняет вычисление при каждом обращении — хранить значение не нужно.
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))

Сеттер свойства

@property_name.setter добавляет сеттер. Теперь c.radius = 10 вызывает метод-сеттер.
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)

Удаление свойства

@property_name.deleter обрабатывает del obj.attr. Используйте его для логики очистки.
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'))

Свойство только для чтения

Определите только геттер, без сеттера. Попытка присвоения вызовет 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)

Свойство с проверкой

Сеттеры идеально подходят для проверки данных — проверяйте тип, диапазон или формат перед сохранением.
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)

Кэширование с помощью property

Объедините @property с кэшированным значением, чтобы вычислить его один раз и сохранить результат.
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 вычисляет свойство один раз и сохраняет его как атрибут экземпляра — повторные вычисления не выполняются.
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))

Свойство и __slots__

__slots__ запрещает создание произвольных атрибутов и экономит память. Свойства добавляют логику. Они хорошо дополняют друг друга.
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)

Когда использовать @property

Используйте @property, когда требуется проверка данных, вычисляемые значения или обратная совместимость при изменении внутренней реализации.
# 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)

Быстрая проверка

Что произойдёт, если попытаться присвоить значение свойству только для чтения, для которого не определён сеттер?

Итоги

@property: геттер превращает доступ к методу в доступ к атрибуту. @name.setter добавляет поддержку записи. @name.deleter добавляет поддержку del. @cached_property вычисляет значение один раз. Сеттеры предназначены для проверки данных.

Продолжайте

Отличный прогресс! Продолжайте, чтобы освоить следующую концепцию.

Часто задаваемые вопросы

Урок «Декоратор @property» бесплатный?

Да — полный текст урока «Декоратор @property» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Декоратор @property»?

Используйте property для геттеров, сеттеров и методов удаления. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Декоратор @property»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Функции как объекты первого класса
  2. Написание пользовательских декораторов
  3. Декоратор @property
  4. @classmethod и @staticmethod
← Назад к Python Academy