私がクラスを持っているとしましょう
class A(object):
def myfunction():
"""A."""
pass
およびサブクラス
class B(A):
def myfunction():
pass
スフィンクスでA.myfunctionからB.myfunctionのAPIドキュメントを継承することは可能ですか?B.myfunctionのドキュメントは「A」である必要があります。同じように。
私がクラスを持っているとしましょう
class A(object):
def myfunction():
"""A."""
pass
およびサブクラス
class B(A):
def myfunction():
pass
スフィンクスでA.myfunctionからB.myfunctionのAPIドキュメントを継承することは可能ですか?B.myfunctionのドキュメントは「A」である必要があります。同じように。
Pythonでは、オブジェクトの作成後に「docstring」に割り当てることで、オブジェクトのドキュメントを設定できます__doc__
。これを行う最もクリーンな方法は、親クラスのdocstringをコピーするデコレータを使用することです。の追加のdocstringを提供し、B.myfunction
それをのドキュメントに追加することもできA.myfunction
ます(おそらくそれを専門にしているため)。次のデコレータ(同様の質問に対する私の回答から採用)を使用して、次のようにオーバーライドされた関数のdocstringをコピーできます。
def copydoc(fromfunc, sep="\n"):
"""
Decorator: Copy the docstring of `fromfunc`
"""
def _decorator(func):
sourcedoc = fromfunc.__doc__
if func.__doc__ == None:
func.__doc__ = sourcedoc
else:
func.__doc__ = sep.join([sourcedoc, func.__doc__])
return func
return _decorator
class A(object):
def myfunction():
"""Documentation for A."""
pass
class B(A):
@copydoc(A.myfunction)
def myfunction():
"""Extra details for B."""
pass
結果:
>>>ヘルプ(B.myfunction) モジュール__main__のメソッドmyfunctionに関するヘルプ: myfunction()unbound__main__。Bメソッド Aのドキュメント。 Bの追加の詳細。
これは、どこからdocstringをコピーしているのかを明示的に示す必要があります@copydoc(A.myfunction)
。コピー元を選択できるため、完全自動ソリューションよりも間違いなく柔軟性があります。
この質問への回答に基づいて、クリーンで完全に自動化されたソリューションは不可能であると結論付けます。「関数は実行時にのみメソッドになる」とこの回答は言うので、デコレータは関数で親クラス名を検索する方法がありません。物体。あなたができる最善のことはデコレータ@copydoc(A)
です。これは非常に簡単ですが、ソースメソッドの名前を追加して、柔軟性を維持することもできます。(同意しない場合は、コメントしてください。コードを提供します)。