これにアプローチする最も簡単で最もPython的な方法は、サブクラスでexecuteを再定義し、基本クラスのexecuteメソッドを呼び出すことであることに同意します。
class Sub(Base):
def execute(self):
"""New docstring goes here"""
return Base.execute(self)
これは、目的を達成するための非常に小さなコードです。唯一の欠点は、Base を拡張するすべてのサブクラスでこのコードを繰り返さなければならないことです。ただし、これは、必要な動作に対して支払う小さな代償です。
実行のためのdocstringが動的に生成されることを確認するずさんで冗長な方法が必要な場合は、記述子プロトコルを使用できます。これは、ここでの他の提案よりもコードが大幅に少なくなります。既存の関数に記述子を設定することはできないため、これは面倒です。つまり、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!"