[Tutor] What protocol to follow when need to pick either one from __getattr__ and __getattribute__ ?
Steven D'Aprano
steve at pearwood.info
Tue Apr 23 12:48:54 EDT 2019
On Tue, Apr 23, 2019 at 08:22:56PM +0530, Arup Rakshit wrote:
> I read today 2 methods regarding the customizing the attribute
> access:__getattr__ and __getattribute__ from
> https://docs.python.org/3/reference/datamodel.html#special-method-names.
> What I understood about them is that __getattr__ is called when the
> requested attribute is not found, and an AttributeError is raised. But
> later is called everytime unconditionally.
When you overload __getattribute__, your class will be slow because
**every** attribute lookup has to go through your method, instead of
only the lookups which fail. And unless you are very careful, you will
break things:
py> class X(object):
... def __init__(self, x):
... self.x = x
... def __getattribute__(self, name):
... if name is 'x': return self.x
...
py> obj = X(999)
py> obj.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattribute__
[ previous line repeats 332 times ]
RecursionError: maximum recursion depth exceeded while calling a Python
object
Normally, overriding __getattribute__ is considered a very advanced and
unusual thing to do.
--
Steven
More information about the Tutor
mailing list