Denis Osipov <osipo...@list.ru> added the comment:

Got it.

But now docs says that overriding the __getattr__() method is enough to 
customize attribute access. It's not completely true.

If I understand it correct, to make __getattr__() work every time you need to 
call it by __getattribute__ or raise AttributeError, e.g. store attributes 
somewhere not in instance __dict__. In this case you need to override 
__setattr__ too.

class MyGetattrClass:
    def __init__(self):
        super().__setattr__("attrs", {})

    def __setattr__(self, name, value):
        self.attrs[name] = value

    def __getattr__(self, name):
        try:
            print(f"{name} equals {self.attrs[name]}")
        except KeyError:
            raise AttributeError(
                f"{type(self).__name__!r} object has no attribute {name!r}"
            ) from None

If it's correct, we probably should add some clarification in expressions doc. 
Or maybe just link to 
https://docs.python.org/3/reference/datamodel.html#object.__getattr__ (which 
mention about it) will be enough.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35165>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to