Конструкция property () возвращает атрибут свойства.
Синтаксис property()
:
свойство (fget = None, fset = None, fdel = None, doc = None)
Рекомендуемая литература: Python @property: как его использовать и почему?
property () Параметры
property()
Принимает четыре дополнительных параметров:
- fget (необязательно) - Функция для получения значения атрибута. По умолчанию
None
. - fset (необязательно) - Функция для установки значения атрибута. По умолчанию
None
. - fdel (необязательно) - Функция для удаления значения атрибута. По умолчанию
None
. - doc (необязательно) - строка, содержащая документацию (docstring) для атрибута. По умолчанию
None
.
Возвращаемое значение из свойства ()
property()
возвращает атрибут свойства из заданного средства получения, установки и удаления.
- Если аргументы не указаны,
property()
возвращает атрибут базового свойства, который не содержит никаких средств получения, установки или удаления. - Если doc не предоставлен,
property()
берет строку документации функции получения.
Пример 1. Создание атрибута с помощью метода получения, установки и удаления
class Person: def __init__(self, name): self._name = name def get_name(self): print('Getting name') return self._name def set_name(self, value): print('Setting name to ' + value) self._name = value def del_name(self): print('Deleting name') del self._name # Set property to use get_name, set_name # and del_name methods name = property(get_name, set_name, del_name, 'Name property') p = Person('Adam') print(p.name) p.name = 'John' del p.name
Вывод
Получение имени Имя: Адам Установка имени для Джона Удаление имени
Здесь _name используется в качестве частной переменной для хранения имени Person.
Также устанавливаем:
- метод
get_name()
получения для получения имени человека, - метод
set_name()
установки для установки имени человека, - метод
del_name()
удаления, чтобы удалить имя человека.
Теперь мы устанавливаем новое имя атрибута свойства, вызывая property()
метод.
Как показано в программе, обращение к p.name
внутренним вызовам get_name()
как получателю, set_name()
установщику и del_name()
как удалителю через печатный вывод, присутствующий внутри методов.
Пример 2: Использование декоратора @property
Вместо использования property()
вы можете использовать декоратор Python @property
для назначения получателя, установщика и удалителя.
class Person: def __init__(self, name): self._name = name @property def name(self): print('Getting name') return self._name @name.setter def name(self, value): print('Setting name to ' + value) self._name = value @name.deleter def name(self): print('Deleting name') del self._name p = Person('Adam') print('The name is:', p.name) p.name = 'John' del p.name
Вывод
Получение имени Имя: Адам Установка имени для Джона Удаление имени
Здесь вместо использования property()
мы использовали @property
декоратор.
Во-первых, мы указываем, что name()
метод также является атрибутом Person. Это делается с помощью метода @property
перед получением, как показано в программе.
Затем мы используем имя атрибута, чтобы указать установщик и удалитель.
Это делается с помощью @name.setter
метода установки и @name.deleter
метода удаления.
Обратите внимание: мы использовали один и тот же метод name()
с разными определениями для определения получателя, установщика и удалителя.
Теперь всякий раз, когда мы используем p.name
, он внутренне вызывает соответствующий метод получения, установки и удаления, как показано в распечатанном выводе внутри метода.