Я согласен, что самый простой, самый Pythonic способ достичь этого - просто переопределить execute в ваших подклассах и заставить его вызывать метод execute базового класса:
class Sub(Base):
def execute(self):
"""New docstring goes here"""
return Base.execute(self)
Это очень маленький код для выполнения того, что вы хотите; Единственным недостатком является то, что вы должны повторять этот код в каждом подклассе, который расширяет Base. Однако это небольшая цена за поведение, которое вы хотите.
Если вы хотите неаккуратный и многословный способ убедиться, что строка документации для исполнения генерируется динамически, вы можете использовать протокол дескриптора, который будет значительно меньше кода, чем другие предложения здесь. Это раздражает, потому что вы не можете просто установить дескриптор для существующей функции, что означает, что execute должен быть написан как отдельный класс с __call__
методом.
Вот код для этого, но имейте в виду, что мой приведенный выше пример намного проще и более Pythonic:
class Executor(object):
__doc__ = property(lambda self: self.inst._execute.__doc__)
def __call__(self):
return self.inst._execute()
class Base(object):
execute = Executor()
class Sub(Base):
def __init__(self):
self.execute.inst = self
def _execute(self):
"""Actually does something!"""
return "Hello World!"
spam = Sub()
print spam.execute.__doc__ # prints "Actually does something!"
help(spam) # the execute method says "Actually does something!"