[Q] Accessors...

Olivier Deckmyn olivier.deckmyn at mail.dotcom.fr
Tue Jul 20 03:00:30 EDT 1999


Thanx A LOT greg :)

I had started to code such a system after reading the "Getters and Setters"
thread in this newsgroup (1999/07/15)

Have a nice day.

Greg Ewing <greg.ewing at compaq.com> a écrit dans le message :
37939CC2.BD5A1AC9 at compaq.com...
> Olivier Deckmyn wrote:
> >
> > This way, because it exists two methods get_XXX and set_XXX, a special
> > proporty XXX would be implicitly created, and would make the user call
> > "automatically" the get/set methods.
>
> Yes, there is a way. If a class has a method
> called __getattr__, it is automatically called
> whenever you try to get the value of an attribute
> which doesn't exist. So you can do something like
>
>   class AutoAccess:
>
>     def __getattr__(self, name, *args, **kw):
>       return apply(getattr(self, "get_"+name), args, kw)
>
> then any class which inherits from AutoAccess will
> have any attempt to get a non-existent XXX attribute
> redirected to a get_XXX method. (Note that the above
> implementation is a bit simplistic -- it will enter an
> infinite loop if there is no get_XXX method defined
> in the class.)
>
> There is a corresponding feature for setting an
> attribute: if there is a __setattr__ method, it gets
> called on every attempt to set the value of an
> attribute, so you can do
>
>     def __setattr__(self, name, value):
>       try:
>         setter = getattr(self, "set_"+name)
>       except AttributeError:
>         setter = None
>       if setter:
>         setter(value)
>       else:
>         self.__dict__[name] = value
>
> This is more complicated because the __setattr__
> method, if present, is called *before* checking
> whether the attribute exists (by necessity, since
> setting an attribute which doesn't already exist
> is perfectly legal). Hence the code to catch the
> case where there is no set_XXX method and set the
> attribute directly.
>
> As you can see, what you are asking for can be
> done, but it is expensive -- attribute access
> through these methods will be considerably slower
> than just calling get_XXX and set_XXX methods
> directly. You'll have to decide whether it's
> worth the price in your application.
>
> Warning: The above code is for illustration
> purposes only -- I haven't tested it!
>
> Greg






More information about the Python-list mailing list