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.