Delegate attribute requests to object

Rami Chowdhury rami.chowdhury at gmail.com
Thu Aug 13 14:29:04 EDT 2009


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)



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

> Unfortunately, __getattr__ didn't work. When I try to use your code
>
> class Decorator:
>> [snip]
>> def __getattr__(self, request):
>>        return self.decorated.__getattr__(request)
>>
>
> I get this error:
>
> AttributeError: 'Decorated' object has no attribute '__getattr__'
>>
>
> Is that a private method, or am I simply using it wrong? Thanks for the
> help.
>
> On Thu, Aug 13, 2009 at 1:18 PM, Rami Chowdhury  
> <rami.chowdhury at gmail.com>wrote:
>
>> 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)
>>
>
>
>



-- 
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