Question about __getattribute__/__getattr__

Joao Prado Maia jpm at papercut.org
Mon Sep 30 23:51:16 CEST 2002


On Mon, 30 Sep 2002, holger krekel wrote:

> The important lines from the above link are:
> 
> def __call__(self, *args):
>         if not self.memo.has_key(args):
>             self.memo[args] = self.fn(*args)
>         return self.memo[args]
> 
> and 'args' is a tuple of arguments.  
> 'args[0]' would give you the first argument, for example.  
> 

Correct. However, the same is not valid for __getattr__. The first and 
only parameter of this magic method is the attribute/method name that you 
are trying to access. It doesn't give you the list of arguments passed to 
a method.

So on my example:

"""
class Real_Class:
    def real_method(self, name):
        print name

class Cache:
    r = None

    def __init__(self):
        self.r = Real_Class()

    def __getattr__(self, attr):
        cached_value = self.get_cache(attr)
        if cached_value == None:
            return getattr(self.r, attr)
        else:
            return cached_value

    def get_cache(self, attr):
        return None

if __name__ == '__main__':
    t = Cache()
    t.real_method('spam')
"""

'attr' is the actual method name I was trying to call, using the 
't.real_method('spam')' line in there.

My question is, how do I get the actual argument list from inside 
__getattr__, so I can create an unique method/argument list signature for 
the cached files ? :)

I'm guessing there must be some deep magic to do this, but I couldn't find 
this anywhere.

Cheers,
Joao





More information about the Python-list mailing list