getattribute вызывается при обычном доступе к атрибуту, а getattr — если поиск завершился AttributeError. Обращение self.attribute внутри getattribute может вызвать бесконечную рекурсию.
Объясните разницу между методами __getattribute__ и __getattr__. Что произойдет, если в первом методе случайно вызвать self.attribute без использования super()?
__getattribute__ вызывается при обычном доступе к атрибуту, а __getattr__ — если поиск завершился AttributeError. Обращение self.attribute внутри __getattribute__ может вызвать бесконечную рекурсию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
getattribute вызывается при обычном доступе к атрибуту, а getattr — если поиск завершился AttributeError. Обращение self.attribute внутри getattribute может вызвать бесконечную рекурсию.
Для базового чтения используйте object.getattribute(self, name) или super().getattribute(name). Иначе новый доступ снова попадёт в переопределённый метод до RecursionError. getattr удобен для вычисляемых резервных атрибутов, но для неизвестного имени должен корректно поднимать AttributeError, чтобы не ломать hasattr и другие протоколы.