Override a method but inherit the docstring

David Stanek dstanek at dstanek.com
Fri Jul 17 08:21:39 EDT 2009


On Fri, Jul 17, 2009 at 3:52 AM, Steven
D'Aprano<steve at 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



More information about the Python-list mailing list