Delegate attribute requests to object

Rami Chowdhury rami.chowdhury at gmail.com
Thu Aug 13 13:18:05 EDT 2009


More information at  
http://www.python.org/doc/2.5.2/ref/attribute-access.html if you need it  
:-)

On Thu, 13 Aug 2009 10:13:47 -0700, Evan Kroske <e.kroske at gmail.com> wrote:

> I don't want to inherit from the classes I'm decorating because they  
> have a
> common superclass. I can make a generic decorator that I can use on all  
> its
> sibling classes. I'll try your getattr method to see if it works.
>
> On Thu, Aug 13, 2009 at 12:07 PM, Rami Chowdhury
> <rami.chowdhury at gmail.com>wrote:
>
>> Perhaps I'm misunderstanding something, but I don't think that's really
>> typical decorator behavior? Typically decorators, as I understand them,  
>> take
>> an instance argument -- so you wouldn't be saying
>>
>>        def __init__(self):
>>                self.decorated = Decorated()
>>
>> you'd be saying
>>
>>        def __init__(self, decorated):
>>                self.decorated = decorated
>>
>> As for the attribute access, I believe you can override __getattr__ to  
>> do
>> what you want:
>>
>>  class Decorator:
>>> [snip]
>>> def __getattr__(self, request):
>>>        return self.decorated.__getattr__(request)
>>>
>>
>> The same thing should work for methods, although you may want to pass
>> arguments through as well.
>>
>> Is there a reason why, for this use, just making Decorator a subclass of
>> Decorated (and only overriding the methods you need to be different)
>> wouldn't work?
>>
>>
>> On Thu, 13 Aug 2009 08:50:47 -0700, Evan Kroske <e.kroske at gmail.com>
>> wrote:
>>
>>  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? Here's some
>>> example
>>> code:
>>>
>>> class Decorator:
>>>
>>>>  def __init__():
>>>>   self.decorated = Decorated()
>>>>
>>>>  def newFunction():
>>>>   # Do something
>>>>   pass
>>>>
>>>>  def interceptRequests(request):
>>>>   return self.decorated.request()
>>>>
>>>> class Decorated:
>>>>  def __init__():
>>>>   self.variable = 10
>>>>
>>>>  def oldFunction():
>>>>   # Do something
>>>>   pass
>>>>
>>>
>>>
>>> I want to be able to do something like this:
>>>
>>> objectA = Decorator()
>>>
>>>> objectB = Decorated()
>>>> assert objectA.oldFunction() == objectB.oldFunction() # No error
>>>>
>>>>
>>> Is it possible (without inheritance)?
>>>
>>> --
>>> Evan Kroske
>>> http://welcome2obscurity.blogspot.com/
>>> The code, comments, and challenges of a novice
>>> software developer desperate for attention.
>>>
>>
>>
>>
>> --
>> Rami Chowdhury
>> "Never attribute to malice that which can be attributed to stupidity" --
>> Hanlon's Razor
>> 408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD)
>>
>
>
>



-- 
Rami Chowdhury
"Never attribute to malice that which can be attributed to stupidity" --  
Hanlon's Razor
408-597-7068 (US) / 07875-841-046 (UK) / 0189-245544 (BD)



More information about the Python-list mailing list