Harddescriptors

Что такое дескрипторы (__get__, __set__)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Дескриптор — объект, контролирующий доступ к атрибуту через __get__, __set__, __delete__. Data descriptor__set__) имеет приоритет над instance __dict__. Non-data (только __get__) — __dict__ побеждает.

class Typed:
    def __init__(self, type_):
        self.type_ = type_

    def __set_name__(self, owner, name):
        self.name = name

    def __get__(self, instance, owner):
        return instance.__dict__.get(self.name)

    def __set__(self, instance, value):
        if not isinstance(value, self.type_):
            raise TypeError(f'{self.name} must be {self.type_}')
        instance.__dict__[self.name] = value

class User:
    name = Typed(str)
    age = Typed(int)

u = User()
u.name = 'Alice'   # валидирует через __set__
u.age = 'x'        # TypeError
  • property — это data descriptor;
  • Используются в ORM (Django fields), dataclasses, pydantic;
  • classmethod, staticmethod реализованы через descriptors.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.