4

私がクラスを持っているとしましょう

class A(object):
  def myfunction():
    """A."""
    pass

およびサブクラス

class B(A):
  def myfunction():
    pass

スフィンクスでA.myfunctionからB.myfunctionのAPIドキュメントを継承することは可能ですか?B.myfunctionのドキュメントは「A」である必要があります。同じように。

4

1 に答える 1

5

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)です。これは非常に簡単ですが、ソースメソッドの名前を追加して、柔軟性を維持することもできます。(同意しない場合は、コメントしてください。コードを提供します)。

于 2012-12-06T12:07:46.600 に答える