本を読んだ後、このコードは少しわかりにくく、デコレータも少しわかりにくいことがわかりました。このコードの分析を手伝っていただければ幸いです。 !
リーリー迷茫2017-05-18 10:52:23
まず、デコレータの原理を理解する必要があります:
リーリーは実際には次のステートメントと同等です:
リーリー関数 abcd ができました。この関数の本質は、別の関数をパラメーターとして受け取り、関数を返すということです。 (返された関数が何に使用されるかについては、あなた次第です)。現時点では、abcd は単なる関数であり、修飾子ではありません。
そして、次の要件は非常に一般的であるため、古い関数があり、新しい関数を定義したいと考えています。この新しい関数は、機能的には古い関数とほぼ同じですが、印刷などの新しい関数が少し追加されています。日付や個人の許可などを判断します。そうなると、新しい関数を定義する過程で必ず古い関数が呼び出されることになりますが、実際には新しい関数はあまり変化せず、古い関数は役に立たないことがよくあります(新しい関数は後で使用することが多いため)。名前空間の変更 混乱を避け、開発を容易にするために、新しい関数を表すために単純に古い関数の名前を使用できます。つまり、新しい関数を定義した後、その名前を前の f に戻します。はもうありません。したがって、これを行うことができます: 関数 f を受け入れて新しい関数を返す関数 abcd を定義し、その戻り値 (新しい関数) を f に代入します (Python の関数名に値を代入して、別の関数にすることもできます)機能)。これは実際に、上記の 2 番目のコードが行うことです。この要件は非常に一般的なため、Python ではこれに特化した構文を定義しています。毎回 f=abcd(f) にする必要はありませんか? それなら、f の def ステートメントの前に @abcd を追加するだけです。面倒なだけでなく、誤解されやすい場合もあります。 。このとき、abcd がデコレータになります。 この等価関係を理解すると、関数を理解しやすくなります。どこかで使用すると、次のようになります
リーリー
は
優先順位は同じで、操作は左から右に行われ、ここで定義された関数が最初に計算されます。
プロセスは次のとおりです:リーリー