Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

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

  1. Типы данных Python
  2. Операторы Python
  3. Оператор передачи Python
  4. Аргументы функции Python
  5. Словарь Питона
  6. Наследование Питона
  7. Перегрузка оператора Python
  8. Итераторы Python
  9. Замыкания Python
  10. Python @property декоратор