Функція property() використовується для визначення властивостей в класах. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Python-програма для пояснення роботи функції property() # Клас Alphabet class Alphabet: def __init__(self, value): self._value = value # Отримання значень def getValue(self): print('Getting value') return self._value # Встановлення значень def setValue(self, value): print('Setting value to ' + value) self._value = value # Видалення значень def delValue(self): print('Deleting value') del self._value value = property(getValue, setValue, delValue) # Передаємо значення x = Alphabet('Acode') print(x.value) x.value = 'Acd' del x.value |
Результат:
Getting value
Acode
Setting value to Acd
Deleting value
Синтаксис функції property()
|
1 |
property(fget=None, fset=None, fdel=None, doc=None) |
Параметри функції property()
Функція property() приймає 4 необов’язкові параметри:
fget (не обов’язково) — функція для отримання значення атрибута. За замовчуванням використовується None;
fset (не обов’язково) — функція для встановлення значення атрибута. За замовчуванням використовується None;
fdel (не обов’язково) — функція для видалення значення атрибута. За замовчуванням використовується None;
doc (не обов’язково) — рядок, який містить документацію (рядок документації) для атрибута. За замовчуванням використовується None.
Значення, яке повертає функція property()
Функція property() повертає атрибут властивості із заданого геттера, сеттера та делітера.
Якщо аргументи не вказані, функція property() повертає базовий атрибут властивості, яка не містить жодного геттера, сеттера чи делітера.
Якщо аргумент doc не вказано, функція property() приймає рядок документації функції геттера.
Приклад №1: Створення атрибута з функціями геттера, сеттера та делітера
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 # Встановлюємо властивість для використання методів get_name, set_name та del_name name = property(get_name, set_name, del_name, 'Name property') p = Person('Adam') print("The name is:", p.name) p.name = 'John' del p.name |
Результат:
Getting name
The name is: Adam
Setting name to John
Deleting name
Тут _name використовується як закрита (private) змінна для зберігання імені Person.
Також ми встановлюємо:
геттер get_name() для отримання імені людини;
сеттер set_name() для встановлення імені людини;
делітер del_name() для видалення імені людини.
І новий атрибут властивості name, викликаючи функцію property().
Як показано в програмі, посилання на p.name внутрішньо викликає метод get_name() як гетер, set_name() як сетер і del_name() як делітер через вивід, який представлений всередині методів.
Приклад №2: Використання декоратора @property
Замість використання функції property() ми можемо використати декоратор @property для присвоювання геттера, сеттера та делітера:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 |
Результат:
Getting name
The name is: Adam
Setting name to John
Deleting name
Тут замість використання функції property() ми використали декоратор @property.
По-перше, ми вказуємо, що метод name() є атрибутом класу Person. Це робиться за допомогою @property перед геттером, як показано у програмі. Далі ми використовуємо атрибут name для вказівки сеттера та делітера. Це робиться за допомогою @name.setter для методу сеттера та @name.deleter для методу делітера. Зверніть увагу на те, що ми використали той же метод name() з різними визначеннями для визначення геттера, сеттера та делітера.
Тепер, коли ми використовуємо p.name, він внутрішньо (під капотом) викликає відповідний геттер, сеттер і делітер.
