Что такое @property и зачем он нужен?
- Как сделать геттер и сеттер в Python?
- Как сделать атрибут только для чтения?
@property превращает метод в атрибут: снаружи obj.area, внутри — вычисление или проверка.
@x.setter— проверка при присваивании, без сеттера — атрибут только для чтения- Можно начать с обычного атрибута и позже заменить на property, не ломая вызывающий код
А ещё В Python не пишут get_x()/set_x() заранее — в этом и смысл
Подробно
property — встроенный дескриптор. Методы с декоратором @property вызываются при обращении к атрибуту, без скобок.
Зачем:
- вычисляемые атрибуты —
rect.areaсчитается из ширины и высоты; - проверка значений — сеттер не даст записать отрицательный возраст;
- только для чтения — если сеттер не объявлен, присваивание бросит
AttributeError; - эволюция интерфейса — класс начинается с обычного публичного атрибута, а когда появляется логика, атрибут заменяют на property. Код, который пишет
obj.x, менять не нужно. Поэтому в Python не принято сразу писать геттеры и сеттеры, как в Java.
Значение обычно хранят в атрибуте с подчёркиванием (self._age) — это соглашение «внутреннее, не трогать снаружи». Двойное подчёркивание включает искажение имени (name mangling) и нужно редко.
Для дорогих вычислений, которые не меняются, есть functools.cached_property.
Пример
class Person:
def __init__(self, age):
self.age = age # проходит через сеттер
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("возраст не может быть отрицательным")
self._age = value
@property
def is_adult(self): # только чтение
return self._age >= 18
p = Person(20)
p.age = -1 # ValueError
p.is_adult = True # AttributeErrorЧто хотят услышать
- Доступ к методу как к атрибуту.
- Применения: вычисление, проверка, только чтение.
- Почему в Python не пишут геттеры заранее.
- Соглашение с подчёркиванием.
Частые ошибки
- Хранить значение в атрибуте с тем же именем, что и property, — бесконечная рекурсия.
- Делать в property тяжёлую или с побочными эффектами работу — от атрибута её не ждут.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Без сеттера property можно присваивать как обычный атрибут — значение просто перезапишет метод
- ✓Превращает метод в атрибут: снаружи obj.area, внутри — вычисление или проверка
- ✗@property делает атрибут приватным
- ✗В Python принято заранее писать get_x и set_x
Что спросят дальше
Разбор темы
- Модель данных — создание объектов, атрибуты и дескрипторы
__new__ и __init__, согласование __eq__ и __hash__, __getattr__ и __getattribute__, дескрипторы и __slots__.
- ООП в Python — классы, свойства, наследование и dataclass
self и __init__, магические методы, property, staticmethod и classmethod, MRO и super, dataclass против namedtuple и Pydantic, ABC и Protocol, метаклассы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.