Сообщить об ошибке.

Класс property() в Python, метод класса как свойство

Легкое создание дескрипторов данных в Python

Синтаксис:

class property(fget=None, fset=None, fdel=None, doc=None)

Параметры:

  • fget=None - функция для получения значения атрибута
  • fset=None - функция для установки значения атрибута
  • fdel=None - функция для удаления значения атрибута
  • doc=None - строка, для строки документации атрибута

Возвращаемое значение:

  • атрибут свойства

Описание:

Класс property() позволяет использовать методы в качестве вычисляемых свойств объектов (дескрипторов данных).

Если задана строка doc, то она будет строкой атрибута свойства. В противном случае строка документации будет скопирована из функции fget, если она существует.

Типичное использование класса property() - определить дескриптор (управляемый атрибут) x:

class C:
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    x = property(getx, setx, delx, "I'm the 'x' property.")

Если c является экземпляром C , то:

  • c.x вызовет метод getx,
  • c.x = value вызовет setx,
  • del c.x вызовет delx.

Используя класс property() в качестве декоратора @property можно легко создавать вычисляемые свойства только для чтения:

class Parrot:
    def __init__(self):
        self._voltage = 100000

    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

p = Parrot()
p.voltage = 220
# AttributeError
del p.voltage  
# AttributeError

Объект декоратора @property также имеет методы getter, setter и deleter, которые можно так же использовать в качестве декораторов. Эти декораторы удобно использовать с функциями, которые реализуют выше указанные свойства.

Это лучше всего объяснить на примере:

class C:
    def __init__(self):
        self._x = None

    @property
    def x(self): # В декораторах 'setter' и 'deleter' нужно указывать имя метода-свойства
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

Этот код в точности соответствует первому примеру. Обязательно присваивайте дополнительным методам (под декораторами setter и deleter) то же имя, что и у исходного метода-свойства.

Так же читайте раздел "Дескрипторы классов в Python".

Изменено в Python 3.5: Добавлена возможность установки строки документации для объекта-свойства