Override a method but inherit the docstring

Rhodri James rhodri at wildebst.demon.co.uk
Thu Jul 16 21:31:43 EDT 2009


On Fri, 17 Jul 2009 02:01:49 +0100, Ben Finney  
<ben+python at benfinney.id.au> wrote:

> Howdy all,
>
> The following is a common idiom::
>
>     class FooGonk(object):
>         def frobnicate(self):
>             """ Frobnicate this gonk. """
>             basic_implementation(self.wobble)
>
>     class BarGonk(FooGonk):
>         def frobnicate(self):
>             special_implementation(self.warble)
>
> The docstring for ‘FooGonk.frobnicate’ is, intentionally, perfectly
> applicable to the ‘BarGonk.frobnicate’ method also. Yet in overriding
> the method, the original docstring is not associated with it.
>
> Ideally there would be a way to specify that the docstring should be
> inherited. The best I can come up with is::
>
>     class BarGonk(FooGonk):
>         def frobnicate(self):
>             special_implementation(self.warble)
>         frobnicate.__doc__ = FooGonk.frobnicate.__doc__
>
> but that violates DRY (the association between BarGonk and FooGonk is
> being repeated),

Not really.  Consider the case of BarGonk being a subclass of FooGonk
and BazGonk; which docstring would you wish to inherit?

> puts the docstring assignment awkwardly after the end
> of the method instead of at the beginning where docstrings normally go,
> and reads poorly besides.

Sounds like a job for a decorator!

(This is probably unbelievably ugly and unwise, since I don't use
decorators at all often.)

def copydoc(cls):
     def _fn(fn):
         if fn.__name__ in cls.__dict__:
             fn.__doc__ = cls.__dict__[fn.__name__].__doc__
         return fn
     return _fn

class BarGonk(FooGonk):
     @copydoc(FooGonk)
     def frobnicate(self):
         special_implementation(self.warble)

-- 
Rhodri James *-* Wildebeest Herder to the Masses



More information about the Python-list mailing list