Как в Python создать setter для атрибута класса

«Как в Python создать setter для атрибута класса» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

Пример:

class Circle:
    def __init__(self, radius):
        self._radius = radius  # Внутренний атрибут

    @property
    def radius(self):
        """Getter для радиуса."""
        return self._radius

    @radius.setter
    def radius(self, value):
        """Setter с валидацией для радиуса."""
        if not isinstance(value, (int, float)) or value <= 0:
            raise ValueError("Радиус должен быть положительным числом")
        print(f"Setter called: new radius is {value}")
        self._radius = value

# Использование
circle = Circle(5)

# Присваивание значения вызывает setter
circle.radius = 10 
# Вывод: Setter called: new radius is 10

print(circle.radius) # Вызывает getter
# Вывод: 10

try:
    circle.radius = -2 # Попытка присвоить некорректное значение
except ValueError as e:
    print(e)
    # Вывод: Радиус должен быть положительным числом

Ключевые моменты:

  1. Связь с геттером: Сеттер должен иметь то же имя, что и метод-геттер (radius), а его декоратор формируется из этого имени: @radius.setter.
  2. Автоматический вызов: Сеттер вызывается автоматически при выполнении операции присваивания: circle.radius = 10.
  3. Контроль данных: Это мощный инструмент для обеспечения целостности данных объекта, позволяющий отклонять некорректные значения.