Delegate attribute requests to object

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Aug 13 23:15:14 EDT 2009


En Thu, 13 Aug 2009 12:50:47 -0300, Evan Kroske <e.kroske at gmail.com>  
escribió:

> I'm trying to use the decorator pattern in a program I'm developing. I  
> want
> to create a decorator object that works like the object it's decorating
> except for a few functions. However, I'd rather not hard-code all the
> identical functionality from the decorated object into the decorator  
> object.
> Is there a way I can intercept all the attribute and function requests  
> for
> the decorator and delegate them to the decorated object?

You may search the list archives for references to "proxy" and  
"delegation". The term "decorator" has a very specific meaning in Python  
(as a syntax construct), don't use it in the search.

> Is it possible (without inheritance)?

Yes, using delegation. See below.

En Thu, 13 Aug 2009 15:29:04 -0300, Rami Chowdhury  
<rami.chowdhury at gmail.com> escribió:

> Oops, my apologies, it's the __getattribute__ method you want to call on  
> self.decorated (because __getattr__ won't be there unless you define it  
> specifically)
> So it should go:
>
> def __getattr__(self, request):
> 	return self.decorated.__getattribute__(request)

__getattribute__ doesn't exist on old-style classes either. Also, note  
that very rarely one has to *call* __special__ methods; the code should  
read:

     def __getattr__(self, request):
	return getattr(self.decorated, request)

but that works *only* for old-style classes, as discussed here [1]. [3] is  
another approach for new-style classes (maybe not production-ready yet).  
And this recipe [2] shows how to make the decorated object keep calling  
methods on the decorator itself.

[1] http://code.activestate.com/recipes/252151/
[2] http://code.activestate.com/recipes/519639/
[3] http://code.activestate.com/recipes/496741/

-- 
Gabriel Genellina




More information about the Python-list mailing list