On 23 May, 14:46, "Steven W. Orr" <[EMAIL PROTECTED]> wrote: > I just discovered decorators. Very cool. My question is that I can't > figure out how to make a decorator not be restricted to a function so it > would also work on a method. > > Here's my code: > > def g(expr): > def rpt(func): > def wrapper(t): > for ii in range(expr): > print ii, > func(t) > wrapper.__name__ = func.__name__ > wrapper.__dict__ = func.__dict__ > wrapper.__doc__ = func.__doc__ > return func > return wrapper > return rpt > > @g(20) > def f(s): > print 's="%s"'%s > f('Hello') > > It works fine, but now I want to apply the same decorator to a class > method. > > class KK: > # @g(20) This obviously doesn't work. > def f(self, s): > print 's= %s'%s > > k = KK() > k.f('Hello') > > Is there a trick I need? > > TIA > > -- > Time flies like the wind. Fruit flies like a banana. Stranger things have .0. > happened but none stranger than this. Does your driver's license say Organ ..0 > Donor?Black holes are where God divided by zero. Listen to me! We are all- 000 > individuals! What if this weren't a hypothetical question? > steveo at syslang.net
For this kind of decorator where you don't care about the values of the arguments you could just use *args (and perhaps **kwargs too)? def g(expr): def rpt(func): def wrapper(*args, **kwargs): for ii in range(expr): print ii, func(*args, **kwargs) wrapper.__name__ = func.__name__ wrapper.__dict__ = func.__dict__ wrapper.__doc__ = func.__doc__ return func return wrapper return rpt Giles -- http://mail.python.org/mailman/listinfo/python-list