6

__getattr__別の関数を呼び出して読み取るようにカスタマイズする必要があります。

これは、help(object.attr) が機能しないことを除けば、うまく機能します。このコードはインタラクティブな環境で使用されるため、help() が重要になります。

同じ機能を実現するためのより良い設計はありますが、help() はうまく機能します。

4

2 に答える 2

1

属性をプロパティに変えることができます。プロパティは、getter メソッドの docstring を独自のものとして自動的に使用します。docまたは、引数をに指定することもできますproperty()

于 2012-02-03T16:13:18.833 に答える
1

「ヘルプ」に使用されるテキストは、実際には__doc__オブジェクトの「 」属性です。__doc__問題は、持っているオブジェクトによっては、単純に属性を設定できないということです。

help(object.attr)" " を機能させることが必要な場合は(help(object)すべての可能な属性が表示されるわけではありません)、もう少し簡単です__getattr__。戻り値が適切に設定された docstring を持っていることだけを確認してください。

「それは機能していません」ので、次のスニペットのように、関数呼び出しの内部結果を返していると思います。

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an integer
        return foo()
    ...

関数 "foo" 自体を呼び出しずにそのまま返すと、その docstring は正常に表示されます。

できること__getattr__は、適切なdocstringを含む動的に作成されたクラスのオブジェクトとして戻り値をラップすることです-したがって、次のようなものを使用してみてください:

def __getattr__(self, attr):
    if attr == "foo":
        #function "foo" returns an (whatever object)
        result = foo()
        res_type = type(result)
        wrapper_dict = res_type.__dict__.copy()
        wrapper_dict["__doc__"] = foo.__doc__ #(or "<desired documentation for this attribute>")
        new_type = type(res_type.__name__, (res_type,), wrapper_dict)
        # I will leave it as an "exercise for the reader" if the 
        # constructor of the returned object can't take an object
        # of the same instance (python native data types, like int, float, list, can)
        new_result = new_type(result)
    elif ...: 
        ...
    return new_result

これは機能するはずです-そもそも彼が機能していない理由を私が間違っていない限り-その場合は、あなたが戻ってきたものの例をいくつか挙げてください__getattr__.

于 2012-02-04T02:29:21.243 に答える