say I have a class:
class x:
def first_x_method(self):
print \'doing first_x_method stuff...\'
def second_x_method(self):
print \'d
Here's a version of the trace
decorator implemented as a class which allows for the other use case asked for: passing in the function to decorate all member functions of the decorated class with.
import inspect
def log(func):
def wrapped(*args, **kwargs):
try:
print "Entering: [%s] with parameters %s" % (func.__name__, args)
try:
return func(*args, **kwargs)
except Exception, e:
print 'Exception in %s : %s' % (func.__name__, e)
finally:
print "Exiting: [%s]" % func.__name__
return wrapped
class trace(object):
def __init__(self, f):
self.f = f
def __call__(self, cls):
for name, m in inspect.getmembers(cls, inspect.ismethod):
setattr(cls, name, self.f(m))
return cls
@trace(log)
class X(object):
def first_x_method(self):
print 'doing first_x_method stuff...'
def second_x_method(self):
print 'doing second_x_method stuff...'
x = X()
x.first_x_method()
x.second_x_method()