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)
Частые ошибки
Попытка обратиться к свойству без определения функции получения значения:
class Test: value = property() t = Test() print(t.value) # Ошибка: AttributeError
Как исправить: Убедитесь, что указаны функции для fget и других методов.
Часто задаваемые вопросы
- Можно ли использовать декоратор для создания свойств? Да, используйте @property для создания свойства, и дополнительные декораторы @<имя_свойства>.setter и @<имя_свойства>.deleter для управления логикой.
- Можно ли изменить свойство после его создания? Да, используйте методы getter(), setter() и deleter() объекта свойства.