Emanuele D'Arrigo wrote: > This is all good and dandy and it works, mostly. However, if you look > at the code below for the method __getattr__, it appears to be > attempting to prevent direct access to -any- variable starting with an > underscore. > > def __getattr__(self, key): > if key[:1]=='_': > raise AttributeError, key > > But access isn't actually prevented because __getattr__ is invoked - > only- if an attribute is not found by normal means. So, is it just me > or that little snipped of code either has another purpose or simply > doesn't do the intended job?
It doesn't do what you think it does; it is there to prevent "infinite" recursion. Have a look at the complete method: > def __getattr__(self, key): > if key[:1]=='_': > raise AttributeError, key > try: > getter= getattr(self, '_get_'+key) > except AttributeError: > raise AttributeError, key > return getter() If you instantiate the object and try to access the -- non-existent -- attribute yadda __getattr__() will be called with key="yadda" which doesn't start with an underscore and with gettattr(self, "_get_yadda") triggers another __getattr__() call as _get_yadda doesn't exist either. If the check weren't there yet another getattr(self, "_get__get_yadda") call would follow, and so on until the recursion limit is reached. Peter -- http://mail.python.org/mailman/listinfo/python-list