Python Runtime Method Call Binding

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Dec 4 09:54:26 EST 2008


k3xji a écrit :
> Hi,
> 
> Is there a way to hook a function call in python? I know __getattr__
> is doing for variables, it is giving us a chance before a field is
> initialized.

Note that since the introduction of the "new-style" object model - that 
is, in Python 2.2 -, computed attributes are better handled with the 
descriptor protocol, and specially the general purpose 'property' class. 
The __getattr__ hook should only be used when you want to handle read 
access to an attribute that doesn't exist at all (ie : automatic 
delegation etc).

Also note that a method is mostly a computed attribute (another 
application of the descriptor protocol FWIW)...

> Do we have same functionality for methods?

Which "functionality" ? What do you want to do ? automatically delegate 
method calls, or "wrap" method calls so you can ie log them or attach 
more behaviour ?

> Example:
> 
> class Foo(object):
>     def __call_method__(self, ...) # just pseudo
>         print 'A method is called in object...'
> 
> f = Foo()
> f.test_method()

Ok, I guess this is the second case. The answer is "decorator".

def log(func):
     def _logged(*args, **kw):
         print "func", func.__name__, " called with ", args, kw
         return func(*args, **kw)
     _logged.__name__ = "logged_%s" % func.__name__
     _logged.__doc__ = func.__doc__
     return _logged

class Foo(object):
     @log
     def method(self, yadda=None):
         print "in Foo.method, yadda = ", yadda
         return yadda

f = Foo()
f.method()
f.method(42)


HTH



More information about the Python-list mailing list