Inheriting methods but over-riding docstrings

Gerard Flanagan grflanagan at
Sat Jan 16 20:02:47 CET 2010

Steven D'Aprano wrote:
> I have a series of subclasses that inherit methods from a base class, but 
> I'd like them to have their own individual docstrings. The obvious 
> solution (other than copy-and-paste) is this:
> class Base(object):
>     colour = "Blue"
>     def parrot(self):
>         """docstring for Base"""
>         return "Norwegian %s" % self.colour
> class SubClass(Base):
>     colour = "Red"
>     def parrot(self):
>         """docstring for Subclass"""
>         return super(Subclass, self).parrot()
> but that adds an awful lot of boilerplate to my subclasses. Are there any 
> other good solutions to this problem?

If I've understood, one idea is:

def type_factory(colour):

     class Base(object):

         def parrot(self):
             """Norwegian %s"""
             return 1
         parrot.__doc__ %= colour

     return Base

class Base(object):

     def __new__(cls, *args, **kw):
         return type_factory(cls.colour)(*args, **kw)

class A(Base):
     colour = "Blue"

class B(Base):
     colour = "Red"

a = A()
b = B()

print inspect.getdoc(a.parrot)
Norwegian Blue
print inspect.getdoc(b.parrot)
Norwegian Red

In the more general case, (ie. where you don't know that there is a 
method called parrot and an attribute called colour), I imagine you 
could do the same thing but at the metaclass level.



More information about the Python-list mailing list