The decorate_meths() function as given fails: TypeError: 'dictproxy' object does not support item assignment
But this version avoids that error (on Python 2.2 thru 2.6): def decorate_meths(klass): for nam, val in klass.__dict__.items(): if callable(val): setattr(klass, nam, decorate(val)) return klass # ? /Jean Brouwers On Dec 20, 11:32 pm, "Chris Rebert" <c...@rebertia.com> wrote: > On Sat, Dec 20, 2008 at 11:12 PM, Piyush Anonymous > > <piyush.subscript...@gmail.com> wrote: > > hi, > > i need to trap all method calls in a class in order to update a counter > > which is increased whenever a method is called and decreased whenever method > > returns. in order to that i am trying to write a decorator for all the > > methods. > > > see the code here with error. > > ------- > >http://codepad.org/2w7JVvDB > > ---- > > any suggestions? any other better way of doing it? > > I call unnecessary use of metaclasses! Here's my (untested) attempt at > a simpler class decorator approach: > > def decorate_meths(klass): > attrs = klass.__dict__.items() > for name, val in attrs: > if callable(val): > klass.__dict__[name] = decorate(val) > > def decorate(method): > #should be called for every method call in the class > def decorated(self, *args, **kwds): > print "2 Inside __call__()" > returnval = method(self, *args,**kwds) > print "3 After self.f(*args)" > return returnval > return decorated > > #...@decorate_meths <-- this syntax requires a later Python version > class Person(object): > def testprint(self,val): > print "blah blah" > Person = decorate_meths(Person) > > #rest of code after the class definition would be the same > > Sidenotes about your code: > - `args` and `kwds` are the conventional names for the * and ** > special arguments > - the `methodname` variable was actually getting method objects, not > strings, as its values; this was probably part of the bug in your > program > > Cheers, > Chris > > -- > Follow the path of the Iguana...http://rebertia.com -- http://mail.python.org/mailman/listinfo/python-list