なぜPythonのデコレータは__get__を定義する必要がありますものの一種として定義され、通常の装飾方法を、与えることができます

PythonCookBookは最近の本、非常に良い本を読んで、唯一の欠点は、本ビット低いのPythonのバージョンで、何の情報コルーチンはありません。

:クラスであることデコレータセクションとして定義され

インポートタイプ
functoolsインポートラップから

クラスプロファイル下:

    デフ__init __(自己、FUNC):
        ラップ(FUNC)(自己)
        self.ncalls = 0

    デフ__call __(自己、* argsを、** kwargsから):
        self.ncalls + = 1
        リターン自己.__ __包まれた(* argsを、** kwargsから)

    デフ__get __(自己、例えば、所有者):
        #プリント(例えば、所有者)
        インスタンスがNoneの場合:
            リターン自己
        そうしないと:
            リターンtypes.MethodType(自己、インスタンス)

 彼は__get__は私がより明確に理解している__get__の論理機能を実現作っ定義するクラスのデコレータで書かれた本を書きました。

クラススパム:
    @Profiled
    デフバー(自己、X):
        プリント(自己、X)

 この方法がプロファイルの__get__内に定義されていない場合にプロファイルさバークラス戻り、モノ - 例プロファイルさ装飾されたときにオブジェクトがインスタンスプロファイルさコールであるが、それは、オブジェクトの結合方法は、スパムの例でなることができません。

__get__例を定義した後、バーのメソッドを呼び出すときに、実際には、バーが__get__メソッドを持っているため、内閣総理大臣は、このメソッドを呼び出して、プロファイル下の例では、バー=プロファイル下(バー)を呼び出し、MethodTypeインスタンス__call__によってプロファイル下この方法は、インスタンスに、すなわちスパムインスタンスが渡されます。

操作の方法を装飾するためにこの場合には、あなたはまた、自己引数に記入する必要はありませんすることができます。

 

functoolsインポートラップから

デフdecorator1(FUNC):
    @wraps(FUNC)
    デフラッパー(*引数):
        印刷( 'Decorator1')
        リターンFUNC(*引数)
    リターンラッパー

クラスデモ:

    #実行= decorator1(実行)
    @ decorator1
    デフ(自己、A)を実行します。
        プリント(F '{}で実行されます')


D =デモ()
d.run( 'sidian')
印刷(d.run)

 上記デコレータの単純な関数であるか、または方法が明らかに後で(クラスの関数が(あると言うことができる)を返す関数である)装飾するための方法で返さ

しかし、機能__get__方法の機能の役割は、例の方法に戻すことができます。

デフ__get __(自己、例えば、所有者):
        #プリント(例えば、所有者)
        インスタンスがNoneの場合:
            リターン自己
        そうしないと:
            リターンtypes.MethodType(自己、インスタンス)

 特定の実行ロジックは、依然として上記と同じであってもよいです。関数オブジェクト内の特定の魔法のメソッド元のコードを見つけることができません、オンラインのC、Cで書かれているかわかりません

実際には、これは主に、プロセスのオブジェクト指向の理解である、あまりよく機能の導入のためのPythonの知識、オブジェクトの内部ロジックの少ない良好な構造の知識および機能があります。

 

おすすめ

転載: www.cnblogs.com/sidianok/p/12318596.html