В чём различие между __getattribute__ и __getattr__, и когда вызывается каждый?
Короткий ответ: __getattribute__ вызывается при каждом обращении к атрибуту; __getattr__ — только если атрибут не найден обычным способом. Внутри __getattribute__ нужно делегировать в super().__getattribute__, иначе будет бесконечная рекурсия.
Библиотека собеса по Python
Post #1343
527