Защищаем данные и контролируем доступ через @property.
⏱️ ~1 ч·Средний·📚 4 урока
Бытовая аналогия
Вспомните банкомат. Вы не лезете руками внутрь к деньгам — вы нажимаете кнопки «снять», «положить», «баланс». Банкомат сам проверяет: хватает ли средств, корректна ли сумма. Внутреннее устройство (где и как лежат деньги) скрыто за понятным интерфейсом. Это и есть инкапсуляция: снаружи — простые кнопки-методыФункция, привязанная к объекту и вызываемая через точку: text.upper()., внутри — защищённые данные.
Инкапсуляция
Инкапсуляция — это сокрытие внутренних деталей объектаКонкретный экземпляр класса — со своими данными. Почти всё в Python является объектом. и контроль доступа к данным. Идея: снаружи объектом пользуются через понятные методы, не залезая в его «внутренности».
В Python нет строгих «private», но есть соглашение: атрибут с одним подчёркиванием _balance — «внутренний, руками не трогать».
▶ encapsulation.py
@property — умные атрибуты
Декоратор @property позволяет обращаться к методу как к атрибуту (без скобок) и добавлять проверки при чтении/записи. Удобно для вычисляемых значений.
▶ property.py
💡Совет
Хорошее правило: храните «сырые» данные в одном месте (_celsius), а производные значения вычисляйте через @property. Тогда данные не рассинхронизируются — фаренгейты всегда пересчитываются из актуальных цельсиев.
💡Совет
🔮 Предскажите вывод
Свойство @property пересчитывается каждый раз заново из актуальных данных. Что выведет код, если после создания объекта поменять _celsius?
▶ predict-property.py
Ответ — 32.0, затем 212.0. Свойство не хранит фаренгейты, а вычисляет их при каждом обращении из текущего _celsius. Поэтому после смены цельсиев на 100 мы сразу получаем точку кипения 212°F — данные не могут «рассинхрониться».
⚠️ Частые ошибки новичков
Частая ошибка — обращаться к @propertyсо скобками, как к обычному методу. Свойство уже возвращает значение, поэтому t.fahrenheit() попытается «вызвать» число и упадёт с TypeError: 'float' object is not callable. Запустите код и уберите лишние скобки.
▶ broken-property.py
Заданиерешение.py
Создайте класс Rectangle с конструктором (width, height). Добавьте свойство area через @property, возвращающее площадь (без скобок при обращении).
Заданиерешение.py
Доп. задача. Создайте «безопасный» класс Wallet с внутренним _balance = 0. Метод add(amount) увеличивает баланс только если amount > 0 (иначе игнорирует). Свойство balance через @property возвращает текущий баланс.
❓Проверь себя
Зачем атрибут называют с подчёркиванием, например _balance?
Как обращаются к атрибуту, помеченному @property?
ℹ️Важно
✅ Что вы узнали
Инкапсуляция прячет внутренние данные за понятными методами (как банкомат прячет деньги за кнопками).
Одно подчёркивание _balance — соглашение «внутреннее, не трогать снаружи».
@property даёт обращаться к методу как к атрибуту и пересчитывает значение при каждом чтении.
К свойству обращаются без скобок; скобки вызовут TypeError.
Комментарии
Загрузка…
Загрузка комментариев…