property()
Функция property() создаёт «управляемый» атрибут класса. Доступ к
такому атрибуту автоматически вызывает функцию-геттер, присваивание —
сеттер, удаление — делитер. Чаще всего применяется как декоратор
@property.
Сигнатура
property(fget=None, fset=None, fdel=None, doc=None)
Параметры:
fget— функция чтения значения.fset— функция записи значения.fdel— функция удаления атрибута.doc— строка документации.
Возвращает: объект-дескриптор property.
Примеры
Только для чтения через @property:
class Circle:
def __init__(self, r):
self._r = r
@property
def area(self):
return 3.14159 * self._r ** 2
c = Circle(5)
print(round(c.area, 2))
78.54
Геттер и сеттер с проверкой:
class Motor:
def __init__(self):
self._speed = 0
@property
def speed(self):
return self._speed
@speed.setter
def speed(self, value):
if not -255 <= value <= 255:
raise ValueError("speed вне диапазона")
self._speed = value
m = Motor()
m.speed = 150
print(m.speed)
150
Делитер для сброса:
class Sensor:
def __init__(self):
self._value = 42
@property
def value(self):
return self._value
@value.deleter
def value(self):
self._value = None
print("значение сброшено")
s = Sensor()
del s.value
print(s.value)
значение сброшено
None
Старый стиль вызова property():
class Temp:
def __init__(self, c):
self._c = c
def get_f(self):
return self._c * 9 / 5 + 32
fahrenheit = property(get_f, doc="температура по Фаренгейту")
t = Temp(100)
print(t.fahrenheit)
212.0
Перехват чтения для логирования:
class Box:
def __init__(self):
self._items = []
@property
def count(self):
print("обращение к count")
return len(self._items)
b = Box()
print(b.count)
обращение к count
0
См. также
Примечание
Описание основано на официальной документации Python (docs.python.org), распространяемой под лицензией PSF License v2. © Python Software Foundation.