Для чего нужны геттеры в Python и как их создать?

Ответ

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

Это ключевой механизм инкапсуляции, который используется для:

  • Вычисляемых свойств: Создания атрибутов, значение которых зависит от других (например, full_name из first_name и last_name).
  • Добавления логики при чтении: Например, форматирование данных перед их возвратом.
  • Создания атрибутов только для чтения (read-only).

Пример:

class User:
    def __init__(self, first_name, last_name):
        self._first_name = first_name # Приватный атрибут
        self._last_name = last_name

    @property
    def full_name(self): # Геттер для вычисляемого свойства
        """Возвращает полное имя пользователя."""
        return f"{self._first_name} {self._last_name}".title()

# Использование
user = User("john", "doe")
# Обращение как к атрибуту, а не вызов метода user.full_name()
print(user.full_name) # Вывод: John Doe

Ключевые особенности:

  • Синтаксис атрибута: Доступ к геттеру выглядит как чтение обычного атрибута (obj.name), а не вызов метода (obj.name()).
  • Атрибут только для чтения: Если определить только @property без соответствующего @name.setter, атрибут станет read-only, и попытка присвоить ему значение вызовет AttributeError.
  • Инкапсуляция: Геттеры скрывают внутреннее представление данных (например, _first_name) от внешнего кода, предоставляя публичный и контролируемый API.