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