2012-02-03 22 views
5

__getattr__をカスタマイズして、別の関数を呼び出す必要があります。__getattr__の定義済み属性のドキュメント

これは、ヘルプ(object.attr)が機能しない場合を除き、うまく機能します。このコードは対話的な環境で使用されるので、help()は私たちにとって重要になります。

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

答えて

1

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

何が必要であれば、それは少し簡単です(help(object)はあなたにすべての可能な属性を示していることではなく)動作する「help(object.attr)」です - あなただけのどんな__getattr__リターンが正しく設定ドキュメンテーション文字列をHAE行うことSHUREを取得する必要があります。

私はあなたがこのスニペットのように、いくつかの関数呼び出しの内部結果を返すされていると思いたい「動作しない」になったのは:あなたは、単に機能「foo」という自体を返す場合

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

、それを呼び出すことなく、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 

これは動作するはずです - 場合を除き:そう、このようsomethong使用してみてください - 何ができるか

は、動的に作成したクラスウィッヒの目的は、適切なドキュメンテーション文字列が含まれているよう__getattr__に戻り値をラップすることです私は間違って、最初の場所で働いていない理由を教えてください。そうであれば、あなたが返すものの例を与えてください__getattr__

+0

Thannks、それは私のケースで動作します。 __getattr__のすべてのattrは、ネイティブのpythonデータ型を返します。 –

1

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

+0

内部__getattr__は、attrをパラメータとして使用する関数呼び出しです。プロパティ()で可能ですか?このattrは動的でオブジェクト作成時には知られていません。 –

関連する問題