Перейти до змісту

Властивості

Значення, які характерезують стан об'єкта (атрибути), доступ до яких відбувається за допомогою сетерів і гетерів, називають властивостями (property).

Для створення властивості використовують функцію:

 property(fget, fset, fdel, doc)

де:

  • fget — Функція, яка реалізує повернення значення властивості
  • fset — Функція, яка реалізує встановлення значення властивості
  • fdel — Функція, яка реалізує видалення значення властивості
  • doc — рядок документації для властивості. Якщо не задано, то береться від fget

Усі параметри необов'язкові.

>>> class Person:
...     def __init__(self, age):
...             self.set_age(age)
...     def get_age(self):
...             return self.__age
...     def set_age(self, age):
...             if age > 0:
...                     self.__age = age
...     age = property(get_age, set_age, None, "Person's age, full years")
...
>>> p = Person(35)
>>> p.age
35
>>> p.age = 18
>>> p.age
18
>>> p.age = -18
>>> p.age
18
>>>
>>> help(Person.age)
Help on property:

    Person's age, full years

>>>

В Python також є ще один більш елегантний спосіб визначення властивостей використовуючи певний "синтаксичний цукор". Для створення властивості-гетера використовуємо:

@property

Для створення властивості-сетера використовуємо:

@<властивість-гетер>.setter

Перепишемо клас Person:

>>> class Person:
...     def __init__(self, age):
...             self.__age = 0
...             self.age = age
...     @property
...     def age(self):
...             return self.__age
...     @age.setter
...     def age(self, age):
...             if age > 0:
...                     self.__age = age
...
>>> p = Person(35)
>>> p.age
35
>>> p.age = -18
>>> p.age
35
>>> p = Person(-35)
>>> p.age
0
>>>

Зверніть увагу на наступне:

  • сетер визначається після гетера
  • і сетер, і гетер називаються однаково — age. І оскільки гетер називається age, то над сетером встановлюється анотація @age.setter
  • і до гетера і до сетера ми звертаємось через вираз p.age
Back to top