Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое @property в Python?
@property — это встроенный декоратор Python, который превращает метод класса в атрибут класса. Это позволяет получать и устанавливать значения через синтаксис как для обычных атрибутов, но при этом выполняя кастомную логику.
Основной синтаксис
Декоратор @property создаёт "вычисляемое свойство" (computed property). При обращении к нему вызывается соответствующий метод:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def fahrenheit(self):
"""Конвертация Цельсия в Фаренгейт"""
return (self._celsius * 9/5) + 32
@fahrenheit.setter
def fahrenheit(self, value):
"""Конвертация Фаренгейта обратно в Цельсий"""
self._celsius = (value - 32) * 5/9
temp = Temperature(25)
print(temp.fahrenheit) # 77.0 — вызовется метод-getter
temp.fahrenheit = 86 # Вызовется метод-setter
print(temp._celsius) # 30.0
Зачем это нужно в Data Engineering?
1. Инкапсуляция данных — скрыть внутреннюю реализацию, получать данные через интерфейс:
class DataSource:
def __init__(self, raw_data):
self._raw_data = raw_data
@property
def processed_data(self):
"""Возвращает обработанные данные"""
# Кэширование, трансформация, валидация
return self._transform(self._raw_data)
2. Ленивое вычисление (lazy loading) — данные рассчитываются только при необходимости:
class MetricsCalculator:
def __init__(self, dataset):
self._dataset = dataset
self._mean_cache = None
@property
def mean(self):
if self._mean_cache is None:
self._mean_cache = sum(self._dataset) / len(self._dataset)
return self._mean_cache
3. Валидация при установке значения:
class User:
def __init__(self, email):
self._email = None
self.email = email # Вызовется setter с валидацией
@property
def email(self):
return self._email
@email.setter
def email(self, value):
if "@" not in value:
raise ValueError("Неверный email")
self._email = value
Отличие от обычного метода
- Метод:
obj.get_value()— нужны скобки - @property:
obj.value— без скобок, как атрибут
Это важно для Data Engineer, так как делает код более читаемым и интуитивным при работе с данными.
@property.deleter
Можно и удалять значение:
class Cache:
def __init__(self):
self._data = {}
@property
def data(self):
return self._data
@data.deleter
def data(self):
self._data.clear()
cache = Cache()
del cache.data # Вызовется deleter
Итоговые преимущества
- Чистота API — работа как с атрибутами
- Гибкость — можем добавить логику без изменения интерфейса
- Производительность — кэширование, ленивые вычисления
- Безопасность — контроль доступа и валидация
@property часто используется в pandas, sqlalchemy, различных ORM для удобного доступа к данным и метаданным.