Декоратор @property
— это встроенный декоратор Python, который позволяет превращать методы класса в "свойства" (properties), то есть атрибуты, доступ к которым контролируется через методы.
@property
предоставляет элегантный способ:
class Circle:
def __init__(self, radius):
self._radius = radius # Защищенный атрибут
@property
def radius(self):
"""Геттер для радиуса"""
return self._radius
@radius.setter
def radius(self, value):
"""Сеттер для радиуса с валидацией"""
if value <= 0:
raise ValueError("Radius must be positive")
self._radius = value
@property
def area(self):
"""Вычисляемое свойство (нет сеттера)"""
return 3.14 * self._radius ** 2
@property
метод вызывается при обращении к атрибуту@<property>.setter
вызывается при присвоении@<property>.deleter
вызывается при del
class DataProcessor:
def __init__(self, data):
self._data = data
self._result_cache = None
@property
def processed_data(self):
if self._result_cache is None:
print("Выполняю сложные вычисления...")
self._result_cache = self._heavy_processing()
return self._result_cache
def _heavy_processing(self):
return [x * 2 for x in self._data]
class Constants:
@property
def PI(self):
return 3.141592653589793
# Не определяем сеттер, поэтому PI нельзя изменить
class LoggedAttribute:
def __init__(self, value):
self.value = value
@property
def value(self):
print("Доступ на чтение")
return self._value
@value.setter
def value(self, new_value):
print(f"Изменение значения с {self._value} на {new_value}")
self._value = new_value
Характеристика | Обычный метод | @property |
---|---|---|
Синтаксис доступа | obj.method() | obj.property |
Может принимать args | Да | Нет |
Может изменять state | Да | Только через сеттер |
Вычисление на лету | При каждом вызове | При каждом обращении |
Свойства правильно определяются в:
@property
превращает методы в атрибуты с контролируемым доступомИспользуйте свойства, когда нужно: