← Все вопросы

Что такое @property и геттеры/сеттеры простыми словами?

Задан 1 месяц назад691 просмотров3 ответа
14

Видел @property над методом, и потом к нему обращаются как к атрибуту, без скобок. Зачем так, если можно просто хранить атрибут?

3 ответа

22

@property позволяет обращаться к методу как к обычному атрибуту (без скобок), но при этом внутри выполнять код — например проверку или вычисление.

Зачем: иногда нужно при чтении что-то посчитать, а при записи — проверить значение, но не хочется ломать удобный синтаксис obj.x. Классический пример — валидация:

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius

    @property
    def celsius(self):          # геттер
        return self._celsius

    @celsius.setter
    def celsius(self, value):   # сеттер
        if value < -273.15:
            raise ValueError("ниже абсолютного нуля нельзя")
        self._celsius = value

t = Temperature(20)
t.celsius = 25      # вызовется сеттер с проверкой
print(t.celsius)    # вызовется геттер -> 25

Идея в том, что снаружи это выглядит как простое поле, а внутри можно добавить логику в любой момент, не переписывая код, который уже им пользуется.

8

Это "умный атрибут". Снаружи obj.celsius, а под капотом — функция. Удобно, когда хочешь начать с простого поля, а потом добавить проверку, не меняя интерфейс.

Семён Новиков а в Python принято писать геттеры на всё подряд как в Java? · 1 месяц назад
noi rock @нет, в Python пишут property только когда реально нужна логика, иначе обычное публичное поле · 1 месяц назад
4

Чтобы не плодить get_x() / set_x() как в джаве.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект