Hi. well if you do dir(a) just after defining 'a' then it does show '__call__'. the reason i wanted to do it is that i wanted to see if theres a uniform way to wrap a function and callable objects so that for example i can get some message printed whenever a function or a function-like-object is called. then i could simply do :
def wrapper(obj): g = obj.__call__ def f(*args,**kwargs): for arg in args:print arg return g(*args,**kwargs) obj.__call__=f but it seems this will not work for functions :( Andreas Kostyrka wrote: > Just a guess, but setting "__X__" special methods won't work in most cases > because these are usually optimized when the class is created. > > It might work if a.__call__ did exist before (because class a: contained > a __call__ definition). > > Andreas > > On Wed, Jun 29, 2005 at 09:15:45AM +0100, Michael Hoffman wrote: > > Rahul wrote: > > > Consider the following: > > > def a(x): > > > return x+1 > > > > > > def b(f): > > > def g(*args,**kwargs): > > > for arg in args: > > > print arg > > > return f(*args,**kwargs) > > > return g > > > > > > a.__call__ = b(a.__call__) > > > > > > now calling a(1) and a.__call__(1) yield 2 different results!! > > > i.e. for functions a(1) doesnt seem to be translated to a.__call__ if > > > you assign a new value to a.__call__? > > > > I don't know why this happens, but setting the __call__ attribute of a > > is a pretty strange thing to do. Why not just set a instead? The > > original function a(x) will still be stored as a closure in what is > > returned from b(). > > > > If this is of purely academic interest then the answer is I don't know. :) > > -- > > Michael Hoffman > > -- > > http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list