Властивості
Значення, які характерезують стан об'єкта (атрибути), доступ до яких відбувається за допомогою сетерів і гетерів, називають властивостями (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