I read a bit on python's object attribute lookup (here: https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#object-attribute-lookup).
Seems pretty straight forward, so I tried it out (python3):
class A:
def __getattr__(self, attr):
return (1,2,3)
a = A()
a.foobar #returns (1,2,3) as expected
a.__getattribute__('foobar') # raises AttributeError
My question is, aren't the two supposed to be identical?
Why does the second one raise an attribute error?
So apparently the answer is that the logic for a.foobar
IS different from the logic for a.__getattribute("foobar")
. According to the data model: a.foobar
calls a.__getattribute("foobar")
and if it raises an AttributeError, it calls a.-__getattr__('foobar')
So it seems the article has a mistake in their diagram. Is this correct?
And another question: Where does the real logic for a.foobar
sit? I thought it was in __getattribute__
but apparently not entirely.
Edit: Not a duplicate of
Difference between __getattr__ vs __getattribute__.
I am asking here what is the different between object.foo
and object.__getattribute__("foo")
. This is different from __getattr__
vs __getatribute__
which is trivial...