On Fri, Jun 10, 2011 at 12:40 PM, Eric Snow email@example.com wrote:
Right now you could do something like this:
def get_basedoc(mro): return next(c.__doc__ for c in mro[1:] if c.__doc__) or None
class Meta(type): __basedoc__ = property(lambda cls: get_basedoc(cls.__mro__))
But then instances don't get __basedoc__, since the metaclass is not in the MRO. To get it on instances you could do this:
class C: __basedoc__ = property(lambda self: get_basedoc(self.__class__.__mro__))
But then getting that attribute on the class will give you the property object and not the docstring.
I'm not sure of a way to resolve that.
Duh, someone just pointed out that you use your own descriptor instead of a property:
class Basedoc: def __get__(self, obj, cls): return next(c.__doc__ for c in cls.__mro__[1:] if c.__doc__) or None
class C: __basedoc__ = Basedoc()
Inherit from the class or add it onto the class with a class decorator or metaclass.