что такое property python

Использование property в Python

Руководство с примерами использования функции property в языке программирования Python.

Введение

Функция property — создает вычисляемое свойство, которое позволяет использовать методы класса в качестве свойств объектов. Свойство — это аттрибут класса, который может считывать или записывать информацию. Использование property создает дескриптор, который позволяет создавать свойства объекту.

Проблема

Давайте рассмотрим пример. Существует класс человек, возраст которого не может быть меньше 0 и больше 120. Типичная ООП программа будет выглядеть примерно так:

Как мы видим в этой реализации присутствуют некоторые проблемы и давайте их рассмотрим внимательно.

Создадим экземпляр 30 летнего человека, и проверим корректность введенных данных.

Число 30 входит в рамки человеческой жизни и проблем у нас не возникло.

Попробуем ввести возраст вне рамок человеческой жизни

В данном примере мы обратились к методу класса, который проверил входные данные, из-за чего нам не удалось выставить некорректный возраст.

Но мы можем напрямую обратиться к аттрибуту self.age и указать абсолютно любой возраст.

Таким способом мы нарушаем алгоритм работы нашего класса, что является серьезной проблемой.

Решение

Для решения этой проблемы существуют два способа. Первый способ подразумевает использование декоратора функции, а второй способ указывает в функции property getter, setter и deleter.

Использование декоратора

@property — это декоратор, который обрабатывает получение, установку и удаление переменных класса так, как это было задумано в Python. Код для вышеописанного сценария будет выглядеть теперь так:

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

Обратите внимание, что обе функции имеют одинаковое имя. Это необходимо для работы программы.

Попробуем установить некорректное значение и посмотрим что получится:

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

Прямое указание функций

Во втором варианте использование property мы описываем функцию для установки значения и получения значения.

Как видите, нам просто нужно было изменить переменные и добавить специальную строку age = property(get_age, set_age), которая залатала дыры в нашем исходном коде и сэкономила нам кучу времени!

Все работает, как и ожидалось.

Вывод

В данном руководстве мы рассмотрели, как и для чего использовать property, воспользовались двумя вариантами реализации и проверили оба. Я не упомянул в статье о так называемых deleter, предлагаю вам сделать это самостоятельно.

Источник

Функция property() в Python

Приглашаем всех желающих на двухдневный онлайн-интенсив «Разработка десктоп-приложения с помощью библиотеки Tkinter». На интенсиве получим начальные навыки бэкенд-разработки на Python, а также начнем разработку десктоп-приложения с помощью библиотеки Tkinter. По итогам 2х дней сможем создать инвестиционное приложение для просмотра актуальной цены на необходимые акции или валюту. Присоединяйтесь!

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

Функция property() используется для определения свойств в классах.

Метод property() обеспечивает интерфейс для атрибутов экземпляра класса. Он инкапсулирует атрибуты экземпляров и предоставляет свойства, аналогично тому, как это работает в Java и C#.

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

fget : (опционально) Функция для получения значения атрибута. Значение по умолчанию None.

fset : (опционально) Функция для задания значения атрибута. Значение по умолчанию None.

fdel : (опционально) Функция для удаления значения атрибута. Значение по умолчанию None.

doc : (опционально) Строка, содержащая документацию. Значение по умолчанию None.

Возврат значений:

Возвращает атрибут свойства из заданных геттера, сеттера и функции удаления.

Аналогично можно написать метод удаления свойства, как в коде ниже.

Таким образом, мы можем определить свойство в классе с помощью функции property() в Python.

Регистрация на двухдневный онлайн-интенсив «Разработка десктоп-приложения с помощью библиотеки Tkinter»: День 1, День 2.

Источник

Создание объектов-свойств

Это занятие является продолжением предыдущего, где мы рассматривали приватные атрибуты, сеттеры и геттеры, а также контроль за их изменением при помощи перегрузки некоторых базовых методов. Однако, пользоваться на практике напрямую геттерами и сеттерами бывает не всегда удобно. Большего изящества кода можно добиться, используя так называемые объекты-свойства (property). Например, мы хотим создать в классе Point свойство

которому можно было бы присваивать и считывать значения подобно обычной переменной:

но с дополнительной проверкой корректности записи и считывания данных. Для этого создадим внутри класса геттер и сеттер, на основе которых будет работать это свойство. Пусть они будут очень простыми:

То есть, при вызове геттера мы возвращаем значение приватного свойства__x, а при вызове сеттера – заносим новое значение в этот атрибут. На основе этих приватных методов создаем свойство через специальный класс property:

Все, наше свойство готово и далее можем работать с ним, используя синтаксис обычной переменной:

Видите, это намного удобнее, чем вызывать отдельно сеттеры и геттеры.

Теперь уберем из геттера и сеттера функцию print и добавим проверку на корректность передаваемых данных:

Теперь, если попытаться передать не числовое значение:

то возникнет исключение ValueError.

У свойства может быть еще один метод, вызываемый при его удалении:

Он указывается третьим параметром при вызове класса property, а четвертым можно указать описание свойства:

Если теперь выполнить удаление свойства:

то увидим сообщение «Удаление свойства» и дальнейшая попытка к его обращению:

приведет к ошибке, т.к. приватного свойства __x уже не существует. Вот так работают и создаются свойства в Python. И давайте здесь же я вам покажу еще один способ объявления свойств через декораторы (если вы не знаете что такое декоратор, то смотрите урок по этой теме – ссылка под этим видео).

Перед геттером мы укажем декоратор

И название метода должно совпадать с названием свойства:

Далее, у сеттера указываем декоратор с то же имя метода:

То есть, пишем имя нашего свойства и через точку зарезервированное имя setter. Ну а перед делитером декоратор

Все, теперь мы абсолютно также можем работать со свойством coordX:

Хорошо, свойство coordX у нас есть. Но нам нужно создать еще одно – coordY. Как вы понимаете, это, фактически, приведет к дублированию кода для coordX, что не есть хорошо, так как нарушает принцип программирования

DRY (Don’t Repeat Yourself) – не повторяйся!

И здесь нам на помощь приходит другой механизм Python – дескрипторы, о котором речь пойдет на следующем занятии.

Видео по теме

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#1: парадигма ООП, классы, экземпляры классов, атрибуты

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#2: методы класса, параметр self, конструктор и деструктор

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#4: объекты свойства (property) и дескрипторы классов

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#5: статические свойства и методы классов, декоратор @staticmethod, создание синглетона

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#6: простое наследование классов, режим доступа protected

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#7: переопределение и перегрузка методов, абстрактные методы

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#8: множественное наследование, функция super

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#9: перегрузка операторов

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#10: собственные исключения и итерабельные объекты

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#11: функторы и менеджеры контекста

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#12: нейронная сеть (пример реализации)

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#14: полиморфизм в ООП на Python

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#15: Моносостояние экземпляров класса

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#16: Магические методы __str__, __repr__, __len__, __abs__

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#17: Коллекция __slots__ для классов

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#18: Как работает __slots__ с property и при наследовании классов

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#19. Введение в обработку исключений

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#20. Распространение исключений (propagation exceptions)

что такое property python. Смотреть фото что такое property python. Смотреть картинку что такое property python. Картинка про что такое property python. Фото что такое property python

#21. Инструкция raise и пользовательские исключения

© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Источник

Python Property

Summary: in this tutorial, you’ll learn about the Python property class and how to use it to define properties for a class.

Introduction to class properties

Since age is the instance attribute of the Person class, you can assign it a new value like this:

The following assignment is also technically valid:

However, the age is semantically incorrect.

To ensure that the age is not zero or negative, you use the if statement to add a check as follows:

And you need to do this every time you want to assign a value to the age attribute. This is repetitive and difficult to maintain.

To avoid this repetition, you can define a pair of methods called getter and setter.

Getter and setter

The getter and setter methods provide an interface for accessing an instance attribute:

In our example, you can make the age attribute private (by convention) and define a getter and a setter to manipulate the age attribute.

The following shows the new Person class with a getter and setter for the age attribute:

In the set_age() method, we raise a ValueError if the age is less than or equal to zero. Otherwise, we assign the age argument to the _age attribute:

The get_age() method returns the value of the _age attribute:

In the __init__() method, we call the set_age() setter method to initialize the _age attribute:

The following attempts to assign an invalid value to the age attribute:

And Python issued a ValueError as expected.

This code works just fine. But it has a backward compatibility issue.

Suppose you released the Person class for a while and other developers have been already using it. And now you add the getter and setter, all the code that uses the Person won’t work anymore.

To define a getter and setter method while achieving backward compatibility, you can use the property() class.

The Python property class

The property class returns a property object. The property() class has the following syntax:

The property() has the following parameters:

The following uses the property() function to define the age property for the Person class.

In the Person class, we create a new property object by calling the property() and assign the property object to the age attribute. Note that the age is a class attribute, not an instance attribute.

The following shows that the Person.age is a property object:

The following creates a new instance of the Person class and access the age attribute:

The john.__dict__ stores the instance attributes of the john object. The following shows the contents of the john.__dict__ :

As you can see clearly from the output, the john.__dict__ doesn’t have the age attribute.

The following assigns a value to the age attribute of the john object:

The Person.__dict__ stores the class attributes of the Person class. The following shows the contents of the Person.__dict__ :

When you assign a value to the age object:

Similarly, when you read from the age property object, Python will execute the function assigned to the fget argument, which is the get_age() method.

By using the property() class, we can add a property to a class while maintaining backward compatibility. In practice, you will define the attributes first. Later, you can add the property to the class if needed.

Источник

Дескрипторы классов в Python.

Руководство по использованию дескрипторов класса.

Содержание:

Протокол дескрипторов класса.

Вот и все, что нужно сделать. Определите любой из этих методов и объект будет считаться дескриптором и может переопределить поведение по умолчанию при поиске в качестве атрибута.

Дескрипторы данных и дескрипторы без данных различаются тем, как вычисляются переопределения по отношению к записям в словаре экземпляра. Если словарь экземпляра содержит запись с тем же именем, что и дескриптор данных, то дескриптор данных имеет приоритет. Если словарь экземпляра содержит запись с тем же именем, что и дескриптор без данных, то уже запись будет имеет приоритет.

Вызов дескрипторов класса.

Детали вызова зависят от того, является ли obj объектом или классом.

Важно помнить следующее:

Пример дескриптора класса.

Протокол дескрипторов класса очень прост и предлагает огромные возможности. Некоторые варианты использования настолько распространены, что были объединены в отдельные вызовы функций.

На протоколе дескриптора основаны: свойства, связанные методы, статические методы и методы классов!

Дескрипторы данных в классе (дескрипторы атрибутов).

В документации показано типичное использование для определения управляемого атрибута x :

Чтобы увидеть, как функция property() реализована с точки зрения протокола дескриптора класса, вот чистый эквивалент на Python:

Встроенная функция property() помогает всякий раз, когда пользовательский интерфейс предоставляет доступ к атрибутам, а затем последующие изменения требуют вмешательства метода.

Классно, неправда ли?

Дескрипторы функций и методы класса.

Объектно-ориентированные функции Python построены на среде, основанной на функциях. Используя дескрипторы, не относящиеся к данным, они легко объединяются.

В чистом Python это работает так:

Запуск интерпретатора показывает, как дескриптор функции работает на практике:

Дескрипторы, не относящиеся к данным.

Дескрипторы, не относящиеся к данным, предоставляют простой механизм для вариаций обычных шаблонов привязки функций к методам.

На этой диаграмме представлена ​​привязка и два ее наиболее полезных варианта:

ПреобразованияВызов из объектаВызов из класса
functionf(obj, *args)f(*args)
staticmethodf(*args)f(*args)
classmethodf(type(obj), *args)f(klass, *args)

Статический метод как дескриптор без данных.

Так как статические методы возвращают базовую функцию без изменений, то вызовы примеров неинтересны:

При использовании протокола дескриптора не относящегося к данным, чистая версия staticmethod() для Python будет выглядеть так:

Метод класса как дескриптор без данных.

В отличие от статических методов, методы класса добавляют ссылку на класс к списку аргументов перед вызовом функции. Этот формат одинаков для того, является ли вызывающий объект объектом или классом:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *