I'm not sure who downvoted you, but I felt the same.
Its been a while since I've been through getattr vs getattribute pages, but I distinctly remember there's a big big difference in how you use them. I was kinda hoping the page had it, but unfortunately it didnt.
Original Author, if you're reading this - kindly do that.
__getattribute__ (new classes only!) hijacks the entire lookup machinery; every time you write instance., you will call it.
__getattr__ allows "normal" lookup (is it a method, does it exist in __dict__, etc) to be done by the VM and isn't called until you would otherwise get an AttributeError.
Its been a while since I've been through getattr vs getattribute pages, but I distinctly remember there's a big big difference in how you use them. I was kinda hoping the page had it, but unfortunately it didnt.
Original Author, if you're reading this - kindly do that.