Какова роль сеттеров в Python и как их реализовать?

Ответ

Сеттер в Python — это метод, который позволяет контролировать присваивание значения атрибуту. Он создается с помощью декоратора @<имя_свойства>.setter и всегда работает в паре с геттером, определенным через @property.

Основное назначение сеттеров — валидация и инкапсуляция. Они гарантируют, что атрибуту присваиваются только корректные данные, соответствующие определенным правилам.

Пример:

class Product:
    def __init__(self, price):
        self._price = price # Приватный атрибут

    @property
    def price(self): # Геттер обязателен для создания сеттера
        return self._price

    @price.setter
    def price(self, value): # Сеттер для валидации
        if value < 0:
            raise ValueError("Цена не может быть отрицательной")
        self._price = float(value)

# Использование
item = Product(100)
print(item.price) # 100

item.price = 150.5 # Срабатывает сеттер
print(item.price) # 150.5

# Попытка установить некорректное значение
try:
    item.price = -50 # Срабатывает сеттер и вызывает исключение
except ValueError as e:
    print(e) # Вывод: Цена не может быть отрицательной

Принцип работы и правила:

  • Связь с @property: Сеттер не может существовать без геттера. Декоратор @price.setter напрямую связан со свойством price.
  • Валидация данных: Это основное применение. Перед сохранением значения в приватный атрибут (например, _price) сеттер выполняет проверки.
  • Прозрачность для пользователя: Для пользователя класса присваивание значения выглядит как работа с обычным атрибутом (item.price = 150), что делает API класса интуитивно понятным.