Чем на низком уровне отличаются методы __getattribute__ и __getattr__ при поиске в __dict__?

__getattribute__ участвует в обычном доступе к любому атрибуту, а __getattr__ вызывается как fallback после AttributeError. Поиск учитывает не только __dict__, но и дескрипторы и MRO.

Короткий ответ

Что ответить на собеседовании

getattribute участвует в обычном доступе к любому атрибуту, а getattr вызывается как fallback после AttributeError. Поиск учитывает не только dict, но и дескрипторы и MRO.

Подробный разбор

Ответ с пояснениями

getattribute участвует в обычном доступе к любому атрибуту, а getattr вызывается как fallback после AttributeError. Поиск учитывает не только dict, но и дескрипторы и MRO.

В стандартном доступе экземпляра data descriptor имеет приоритет над словарём экземпляра, затем рассматриваются non-data descriptors и атрибуты класса. slots может хранить значения без обычного dict. В переопределённом getattribute используйте object.getattribute(self, name), чтобы не вызвать рекурсию через self.name. Не подавляйте AttributeError бездумно: это меняет поведение fallback.

Источник: docs.python.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее