Объясните разницу между методами __getattribute__ и __getattr__. Что произойдет, если в первом методе случайно вызвать self.attribute без использования super()?

__getattribute__ вызывается при обычном доступе к атрибуту, а __getattr__ — если поиск завершился AttributeError. Обращение self.attribute внутри __getattribute__ может вызвать бесконечную рекурсию.

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

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

getattribute вызывается при обычном доступе к атрибуту, а getattr — если поиск завершился AttributeError. Обращение self.attribute внутри getattribute может вызвать бесконечную рекурсию.

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

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

getattribute вызывается при обычном доступе к атрибуту, а getattr — если поиск завершился AttributeError. Обращение self.attribute внутри getattribute может вызвать бесконечную рекурсию.

Для базового чтения используйте object.getattribute(self, name) или super().getattribute(name). Иначе новый доступ снова попадёт в переопределённый метод до RecursionError. getattr удобен для вычисляемых резервных атрибутов, но для неизвестного имени должен корректно поднимать AttributeError, чтобы не ломать hasattr и другие протоколы.

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

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

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

Подробнее