On Fri, Jul 17, 2009 at 3:52 AM, Steven D'Aprano<st...@remove-this-cybersource.com.au> wrote: > On Fri, 17 Jul 2009 12:58:48 +1000, Ben Finney wrote: > >>> Using a decorator in this manner requires repeating the super class >>> name. Perhaps there is a way to get the bases of BarGonk, but I don't >>> think so, because at the time that the decorator is called, BarGonk is >>> not yet fully defined. >> >> Yes, I tried a few different ways, but within the decorator it seems the >> function object is quite unaware of what class it is destined for. > > > When the decorator is called, the function object is just a function > object, not a method, so there is no concept of "what class it is > destined for". > >>>> def dec(func): > ... print type(func) > ... try: > ... print func.im_class > ... except: > ... print "no im_class" > ... return func > ... >>>> class Test(object): > ... @dec > ... def spam(self): > ... pass > ... > <type 'function'> > no im_class >>>> type(Test.spam) > <type 'instancemethod'> >>>> Test.spam.im_class > <class '__main__.Test'> > > > I suppose you could try to determine what namespace you're currently when > the class is created, but that's surely going to be fragile and messy. >
It isn't too bad. I got the idea to use the method's enclosing scope[1] in my decorator[2] from DecoratorTools. I am working to remove it because it make me sad, but it does work. [1] http://code.google.com/p/snake-guice/source/browse/snakeguice/decorators.py#51 [2] http://code.google.com/p/snake-guice/source/browse/snakeguice/decorators.py#58 -- David blog: http://www.traceback.org twitter: http://twitter.com/dstanek -- http://mail.python.org/mailman/listinfo/python-list