property

Функция property() используется для создания управляемых атрибутов (свойств) в классах Python. Это позволяет добавлять логику при чтении, записи и удалении атрибутов.

Синтаксис

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

Аргументы

  • fget (опционально):
    • Что означает: Функция для получения значения свойства.
    • Значение по умолчанию: None.
  • fset (опционально):
    • Что означает: Функция для установки значения свойства.
    • Значение по умолчанию: None.
  • fdel (опционально):
    • Что означает: Функция для удаления свойства.
    • Значение по умолчанию: None.
  • doc (опционально):
    • Что означает: Документация для свойства.
    • Значение по умолчанию: None.

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

Возвращает объект свойства (property).

Примеры использования

class Circle:
    def __init__(self, radius):
        self._radius = radius

    def get_radius(self):
        return self._radius

    def set_radius(self, value):
        if value < 0:
            raise ValueError("Радиус не может быть отрицательным")
        self._radius = value

    def del_radius(self):
        del self._radius

    radius = property(get_radius, set_radius, del_radius, "Свойство для радиуса")

c = Circle(10)
print(c.radius)  # Вывод: 10
c.radius = 20
print(c.radius)  # Вывод: 20

try:
    c.radius = -5  # Ошибка: ValueError
except ValueError as e:
    print(e)

Эквивалентный код

class pyplanet_property:
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, instance, owner):
        if self.fget is None:
            raise AttributeError("unreadable attribute")
        return self.fget(instance)

    def __set__(self, instance, value):
        if self.fset is None:
            raise AttributeError("can't set attribute")
        self.fset(instance, value)

    def __delete__(self, instance):
        if self.fdel is None:
            raise AttributeError("can't delete attribute")
        self.fdel(instance)

Частые ошибки

  1. Попытка обратиться к свойству без определения функции получения значения:

    class Test:
        value = property()
    
    t = Test()
    print(t.value)  # Ошибка: AttributeError
    

    Как исправить: Убедитесь, что указаны функции для fget и других методов.

Часто задаваемые вопросы

  1. Можно ли использовать декоратор для создания свойств? Да, используйте @property для создания свойства, и дополнительные декораторы @<имя_свойства>.setter и @<имя_свойства>.deleter для управления логикой.
  2. Можно ли изменить свойство после его создания? Да, используйте методы getter(), setter() и deleter() объекта свойства.