Что такое descriptors и как они связаны с геттерами и сеттерами
Что проверяют
Знание модели атрибутов Python ниже уровня property. На дескрипторах держатся property, classmethod, staticmethod, functools.cached_property и само связывание методов, поэтому вопрос показывает, понимаете ли вы, что происходит при обращении obj.attr, или просто пользуетесь синтаксисом.
Как отвечать
Дескриптор это класс, реализующий любой из методов __get__, __set__, __delete__, экземпляр которого лежит атрибутом другого класса. Делятся на два вида, и это ядро ответа: дескриптор данных определяет __set__ либо __delete__, дескриптор не данных только __get__.
От вида зависит приоритет поиска. Обращение obj.attr разрешается так: сначала дескриптор данных из класса и его MRO, затем __dict__ экземпляра, затем дескриптор не данных и обычный атрибут класса, и лишь потом __getattr__. Поэтому property перебивает одноимённый ключ в словаре экземпляра, а cached_property намеренно даёт себя затереть: первый вызов кладёт результат в __dict__, и дальше дескриптор не участвует.
Ещё два факта, которые ценят: имя поля берут не из аргумента конструктора, а из __set_name__, который интерпретатор зовёт при создании класса; обычные функции это дескрипторы не данных, и связанный метод с подставленным self получается как раз вызовом их __get__.
Где спотыкаются
Хранят состояние на самом дескрипторе. Он существует в единственном экземпляре на класс, поэтому значение становится общим для всех объектов, и баг проявится не на тесте с одним объектом, а на проде со вторым. Место значения это __dict__ экземпляра.
Не различают два вида и путаются в приоритетах. Присваивание obj.x = 5 при property без сеттера падает с AttributeError, а при дескрипторе не данных молча кладёт значение в словарь экземпляра и выключает дескриптор. Это же различие объясняет скорость кэширующего декоратора после первого вызова.
Забывают про обращение через класс. В __get__ аргумент с экземпляром приходит равным None, когда пишут MyClass.attr, и наивная реализация падает на попытке достать значение из несуществующего объекта. Корректный вариант возвращает тогда сам дескриптор, иначе ломаются интроспекция и сборка документации.