execute a function before and after any method of a parent class

Terry Reedy tjreedy at udel.edu
Fri Oct 3 18:34:11 EDT 2008


Gabriel Genellina wrote:
> En Fri, 03 Oct 2008 11:03:22 -0300, TP <Tribulations at paralleles.invalid> 
> escribió:
> 
>> I would like to be able to specialize an existing class A, so as to 
>> obtain a
>> class B(A), with all methods of B being the methods of A preceded by a
>> special method of B called _before_any_method_of_A( self ), and 
>> followed by
>> a special method of B called _after_any_method_of_A( self ).
>>
>> The goal is to avoid to redefine explicitly in B all methods of A.
>>
>> Is this possible in Python?
> 
> Sure. After reading this (excelent!) article by M. Simionato 
> http://www.phyast.pitt.edu/~micheles/python/documentation.html you 
> should be able to write a decorator to make any method into a "sandwich" 
> (probably based on his "trace" example). Your code would look like this:
> 
> @decorator
> def sandwich(f, self, *args, **kw):
>     self.before()
>     f(self, *args, **kw)
>     self.after()
> 
> class A:
>   @sandwich
>   def foo(self):
>     ...
> 
>   @sandwich
>   def bar(self, x):
>     ...
> 
> Ok, but then you have to explicitely decorate every method. To avoid 
> this, you may use a metaclass; this article by Michael Foord explains how:
> http://www.voidspace.org.uk/python/articles/metaclasses.shtml#a-method-decorating-metaclass 

I believe this would work (untested, 3.0):

class A(): # define methods

class B(): pass
func = type(lambda:None)
for item in A.__dict__:
   if isinstance(item, func):
     setattr(B, item.__name__, sandwich(item))

tjr




More information about the Python-list mailing list