← Назад к вопросам

Что такое @property?

1.0 Junior🔥 151 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое @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 для удобного доступа к данным и метаданным.