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' # TypeErrorproperty— это data descriptor;- Используются в ORM (Django fields), dataclasses, pydantic;
classmethod,staticmethodреализованы через descriptors.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.