Decoratorの良いレコードは、マルチスレッド、マルチプロセスを残し、Ctripのは、フロントはまだ再負って、書き込みに、あまりにも強い再とき知りません。
デコレータは、私は結果的に後で連絡フラスコ、あなたはこのようなものをデザインする理由がわからない、理解していない、Djangoはミドルウェアが、いくつかのデコレータ、いわゆるを知らなかった見たのは初めてを覚えています。
まず第一に、すべてのものは、私がそのような行動を受け入れることができない長い時間のために、少なくとも、Pythonはオブジェクトの機能は、Pythonにあまりにも通常のが、新しいものであるように、オブジェクトです。
まず、シンプルなデコレータ:
# - * - コーディング:UTF-8 - * - 輸入ランダム デフチェック(FUNC): (「私は、私が最初に起動しますFUNC午前」)印刷 デフラップ(* argsを、** kwargsから): RES = FUNC(* argsを、** kwargsから) 解像度> 0の場合: リターンRES 他: 0を返します 印刷(「私は外出」) リターン・ラップ @チェック DEF FOO(M、N): 戻りrandom.randint(M、N)
これは、非常に一般的なデコレータである負の出力が0です。
@Checkいわゆるシンタックスシュガーは非常に興味深いです、あなたは、任意のチェックや関数foo、まだ単一の出力を行いません
私はFUNCです、私が最初に開始します 私が出て行く
この説明チェック機能は他の機能は、装飾的なラップで機能リターンを確認し、実行されました。何が最終的にそこに起こりました。
シンタックスシュガーの@Check後に、実際には、スクリプトが実行される使用するときは、内部のPythonのfoo =チェック(FOO)の最初の実行は
ので、チェック機能が実行され、返されたラップチェックのfoo関数実行となっています。
印刷(FOO .__ name__)
ラップ
以前のコードでは、コード名が印刷fooの場合、名前を検索しますfooが変更されました。
今、私はFOOをラップし、ドキュメンテーション文字列の一部を示して追加する必要があります。
輸入ランダム デフチェック(FUNC): (「私は、私が最初に起動しますFUNC午前」)印刷 デフラップ(* argsを、** kwargsから): 「」「「私の名前はハロー、ラップです」」 RES = FUNC(* argsを、** kwargsから) 解像度> 0の場合: リターンRES 他: 0を返します 印刷(「私は外出」) リターン・ラップ @チェック DEF FOO(M、N): 「」「」「私の名前はfooが、ハローは」 戻りrandom.randint(M、N) 印刷( 'foo_docstring ---->'、FOO .__ doc__内の例題)
foo_docstring ---->私の名前はハロー、ラップで
変更されたのfooドキュメンテーション文字列の実行からわかるように、その本来の機能があまりにも非友好的であること、変更を送信する元の単一機能のいくつかの内部属性、あなたはまた、デコレータデコレータは、元の関数の実行には影響しません避けますあまりにも横柄。
Pythonは解決することができ、元のモジュールがあり、これらを考えました。
輸入ランダム
輸入functools
デフチェック(FUNC):
(「私は、私が最初に起動しますFUNC午前」)印刷
@ functools.wraps(FUNC)
デフラップ(* argsを、** kwargsから):
「」「「私の名前はハロー、ラップです」」
RES = FUNC(* argsを、** kwargsから)
解像度> 0の場合:
リターンRES
他:
0を返します
印刷(「私は外出」)
リターン・ラップ
@チェック
DEF FOO(M、N):
「」「」「私の名前はfooが、ハローは」
戻りrandom.randint(M、N)
印刷( 'foo_docstring ---->'、FOO .__ doc__内の例題)
プリント(FOO(2、6))
印刷( 'foo_name ---->'、FOO .__ name__)
foo_docstring ---->私の名前はハロー、FOOです 3 foo_name ----> fooの
デコレーション後のfooインテリアデコレーターの出力からわかるように、何も変わっていません。
次に、私は、少なくとも私はそう思う、このマルチミドルウェアフレームワークが良く理解している必要があります理解して多層デコレーター、について話しています。
多層デコレータは、多くの@、この多層デコレータであり、実際には少しの再帰的な感じ。
デフdeco1(FUNC): 印刷(「これはdeco1です」) デフWRAP1(* argsを、** kwargsから): 印刷( 'deco1を入力してください:') 結果= FUNC(* argsを、** kwargsから) 印刷( '退出deco1') リターン結果 リターンWRAP1 デフdeco2(FUNC): 印刷(「これはdeco2です」) デフWRAP2(* argsを、** kwargsから): 印刷( 'deco2を入力してください') 結果= FUNC(* argsを、** kwargsから) 印刷( '退出deco2') リターン結果 リターンWRAP2 デフdeco3(FUNC): 印刷(「これはdeco3です」) デフWRAP3(* argsを、** kwargsから): 印刷( 'deco3を入力してください') 結果= FUNC(* argsを、** kwargsから) 印刷( '退出deco3') リターン結果 リターンWRAP3 @ deco1 @ deco2 @ deco3 DEF foo2は(X、Y): リターンのx ** yの 印刷( '_' * 100) foo2は(3、4)
これはdeco3です これはdeco2です これはdeco1です ____________________________________________________________________________________________________ deco1を入力します。 deco2を入力します。 deco3を入力します。 終了deco3 終了deco2 終了deco1
上記のコードは、最初に全てのPythonまたは糖衣構文に基づいての三のデコレータを実行し、三飾ら行うプリントアウト内部最初の三つの装飾機能の出力にすることです。
ビューの初期化の観点から、装飾からの初期化。割り当てを行われているものの実装では、デコレータデコレータ機能、それを分析してみましょう。
初期化中に、最初はfoo2は装飾します
戻るfoo2は= deco3(foo2は)関数WRAP3
次へ:WRAP3機能がdeco2に渡さ
foo2は= deco2(WRAP3)関数が返すWRAP2
次:deco1に渡さWRAP2機能
foo2は= deco1(WRAP2)関数が返すWRAP1
だから、最後に、foo2はなっWRAP1を初期化
したがって、foo2は()の実行中に、それは最初WRAP1実行になった、実行WRAP1はFUNC内部WRAP1を実行するWRAP2で、実行WRAP2最後WRAP3はfoo2は内部にその機能を実行する、WRAP3内部WRAP2実行されます。
しかし、foo2は関数は、実行WRAP3から戻っ始め、その結果を通過し、最終的にWRAP1結果に渡され、FOOを実行するために、実際には、デコレータの多くを行って、周りに感じます。
多くの多層化粧枠は一定の条件を提供し、あなたが機能を実行すると、プロセスはまた、外側に渡すことができ、ヘルプデコレータにフィルタパラメータの数が先行し、あなたの関数を実行するかどうかを判断するために、も同様です機能を制限する実装の最終結果が出て渡すことはできません。私はそれを学ぶために非常に簡単になると思うので、ノウハウ理由でそれ以上に、使用する方法を知っているだけでなく、それらのフレームワークを研究する基礎を学ぶことを期待して、急い始める理由ジャンゴ、フラスコ内の今の私、なぜ実際には、これがあります。
再びパラメータでデコレータ、パラメータデコレータデコレータは、本質的に生産機械は、外部とデコレータとレイヤ機能セットされているが、デコレータに戻されます。
DEF sum_rand(N): デフLLL(FUNC): デフラップ(* argsを、** kwargsから): C = 0 Iレンジ(N)でのために: C + = FUNC(* argsを、** kwargsから) リターンC リターン・ラップ リターンLLL @sum_rand(90000)#1 lllがデコレータを生成するために実行しました DEF FXX(X、Y): リターンのx * yの プリント(FXX(2、3))
上記のことは2の倍数と積和の数を返す、パラメータを有するデコレータです。
@sum_rand(90000)はデコレータの生産があり
、実際には、@ sum_rand(90000)はLLLデコレータ機能ですが、あなたはデコレータの外側の層では彼の議論、セットを読むために必要がある理由、それはデコレータを返してみましょう。
私は実際には、また別の話、次の章では、私はデコレータの種類を記録します、振り返ってみると、ほとんどこれらのデコレータの機能であなたに書き込みます。