On Fri, 10 Jun 2011 16:47:03 +0000, Steven D'Aprano wrote: > On Thu, 09 Jun 2011 00:22:54 -0600, Eric Snow wrote: > >> Sometimes when using class inheritance, I want the overriding methods >> of the subclass to get the docstring of the matching method in the base >> class. You can do this with decorators (after the class definition), >> with class decorators, and with metaclasses [1]. > > > Here's some Python 3 code that uses a factory function as a metaclass to > inherit docstrings. Give the class a docstring of an empty string, and > it will be inherited from the first superclass found with a non-empty > docstring. [...]
And here's a version using a more conventional metaclass. Extending this to work on methods is left as an exercise. class MetaDocstring(type): @staticmethod def get_mro(bases): return type('K', bases, {}).__mro__[1:-1] @staticmethod def get_docstring(mro): for k in mro: if k.__doc__: return k.__doc__ def __new__(cls, name, bases, dict): mro = None docstring = dict.get('__doc__') if docstring == '': mro = cls.get_mro(bases) dict['__doc__'] = cls.get_docstring(mro) assert dict.get('__doc__') != '' # Create the class we want, and return it. K = super().__new__(cls, name, bases, dict) if mro: assert K.__mro__ == (K,) + mro + (object,) return K class U(metaclass=MetaDocstring): pass class V(U): '' class W(V): 'A docstring.' class X(V): pass class Y(X, W): '' class Z(Y): '' assert all(type(cls) is MetaDocstring for cls in (U, V, W, X, Y, Z)) assert all(cls.__doc__ is None for cls in (U, V, X)) assert all(cls.__doc__ == 'A docstring.' for cls in (W, Y, Z)) -- Steven -- http://mail.python.org/mailman/listinfo/python-list