Python @property декоратор
Декоратор Python @property
В этом руководстве вы узнаете о декораторе Python @property; питонический способ использования геттеров и сеттеров в объектно-ориентированном программировании.
Программирование на Python предоставляет нам встроенный 02
декоратор, который значительно упрощает использование геттеров и сеттеров в объектно-ориентированном программировании.
Прежде чем вдаваться в подробности о том, что такое 10
декоратор, давайте сначала догадаемся, зачем он вообще нужен.
Класс без геттеров и сеттеров
Предположим, что мы решили создать класс, который хранит температуру в градусах Цельсия. Также будет реализован метод преобразования температуры в градусы по Фаренгейту. Один из способов сделать это заключается в следующем:
01
Мы можем создавать объекты из этого класса и манипулировать 29
атрибут, как мы хотим:
10пре>Вывод
28Дополнительные десятичные знаки при преобразовании в градусы Фаренгейта связаны с арифметической ошибкой с плавающей запятой. Чтобы узнать больше, посетите страницу Арифметическая ошибка с плавающей запятой в Python.
Всякий раз, когда мы назначаем или извлекаем любой атрибут объекта, такой как
38
как показано выше, Python ищет его во встроенном42
объекта. атрибут словаря.32Следовательно,
<час>51
внутри становится66
.Использование геттеров и сеттеров
Предположим, мы хотим расширить возможности использования Celsius. класс, определенный выше. Мы знаем, что температура любого объекта не может опускаться ниже -273,15 градусов по Цельсию (абсолютный ноль в термодинамике)
Давайте обновим наш код, чтобы реализовать это ограничение значения.
Очевидным решением вышеуказанного ограничения будет скрытие атрибута
70
(сделайте его закрытым) и определите новые методы получения и установки для управления им. Это можно сделать следующим образом:40Как мы видим, приведенный выше метод вводит два новых
85
и96
методы.Кроме того,
<час>105
был заменен на117
. Подчеркивание128
в начале используется для обозначения закрытых переменных в Python.Теперь воспользуемся этой реализацией:
58
Вывод
61Это обновление успешно реализовало новое ограничение. Нам больше нельзя устанавливать температуру ниже -273,15 градуса Цельсия.
Примечание :Частные переменные на самом деле не существуют в Python. Есть просто нормы, которые нужно соблюдать. Сам язык не накладывает никаких ограничений.
73Однако большая проблема с приведенным выше обновлением заключается в том, что все программы, которые реализовали наш предыдущий класс, должны изменить свой код с
131
. до145
и все выражения типа155
до167
.Этот рефакторинг может вызвать проблемы при работе с сотнями тысяч строк кода.
В общем, наше новое обновление не было обратно совместимо. Здесь
<час>179
приходит на помощь.Класс свойства
Пифонический способ решить вышеуказанную проблему — использовать
188
учебный класс. Вот как мы можем обновить наш код:80Мы добавили
193
функция внутри206
и210
чтобы четко видеть, что они выполняются.Последняя строка кода создает объект свойства
224
. Проще говоря, свойство добавляет некоторый код (238
и246
) к доступам к атрибутам члена (254
).Давайте воспользуемся этим кодом обновления:
90Вывод
107Как мы видим, любой код, извлекающий значение
261
автоматически вызовет272
вместо поиска по словарю (__dict__). Точно так же любой код, который присваивает значение282
автоматически вызовет292
.Мы даже можем видеть выше, что
303
был вызван, даже когда мы создали объект.115Можете ли вы догадаться, почему?
Причина в том, что при создании объекта
310
вызывается метод. Этот метод имеет строку329
. Это выражение автоматически вызывает330
.Точно так же любой доступ, такой как
346
автоматически вызывает359
. Вот что делает свойство. Вот еще несколько примеров.120Используя
368
, мы видим, что никаких изменений в реализации ограничения значения не требуется. Таким образом, наша реализация обратно совместима.Примечание :фактическое значение температуры сохраняется в приватном
<час>371
переменная.382
атрибут — это объект свойства, который предоставляет интерфейс для этой закрытой переменной.Декоратор @property
В Python
393
это встроенная функция, которая создает и возвращает код401
объект. Синтаксис этой функции:134где,
416
это функция для получения значения атрибута429
это функция для установки значения атрибута437
это функция для удаления атрибута444
это строка (например, комментарий)
Как видно из реализации, эти аргументы функции необязательны. Итак, объект свойства можно просто создать следующим образом.
147
Объект свойства имеет три метода:451
, 461
и 475
указать 481
, 492
и 504
в более поздний момент. Это означает, что строка:
159
можно разбить на:
166
Эти две части кода эквивалентны.
Программисты, знакомые с декораторами Python, могут понять, что описанную выше конструкцию можно реализовать как декораторы.
Мы можем даже не определять имена 516
и 520
поскольку они не нужны и загрязняют пространство имен классов.
Для этого мы повторно используем 533
name при определении наших функций получения и установки. Давайте посмотрим, как это реализовать в декораторе:
179
Вывод
186
Приведенная выше реализация проста и эффективна. Рекомендуемый способ использования 540
.
Python