3

私はPythonに比較的慣れておらず、最近「@」pythonデコレータにさらされました。多くの用途があることは知っていますが、その用途の 1 つについての私の理解が、次のコードでのより具体的な用途が正しいかどうかを明確にしたいと思います。

@app.before_request
def before_request():
    g.db = connect_db()

Flask で作業しているときにデコレータに遭遇し、Python の上記のコードが「@」デコレータを使用して「app」クラスのメソッド「before_request」を「オーバーライド」するかどうか疑問に思っています。Python に Java のような他の形式のメソッド オーバーライドがあるかどうかはわかりませんが、Java を知っているので、実際にそうである場合は、このように理解する方が簡単です。

4

1 に答える 1

5

Python では、関数はファースト クラス オブジェクトであるため、パラメーターとして渡すことができます。

次の説明をわかりやすくするために、関数を書き直します。

@app.before_request
def f():
    g.db = connect_db()

まずapp.before_request機能です。

ここで何が起こるかは次のとおりです。

def f():
    g.db = connect_db()

f = app.before_request(f)

したがって、 functionapp.before_requestは function に適用されますf

app.before_requestはデコレータとして使用されるため、 の結果はapp.before_requestに再度割り当てられfます。しかし、この場合は問題ではありません。重要なのは、それを利用するためにapp.before_request内部で何かfを作成することです。

デコレータは、簡潔で美しい方法で説明するためだけに使用されます。

このコードで同じことを達成できます(デコレータを使用したコードよりも読みにくいと思います):

def f():
    g.db = connect_db()

app.before_request(f)
于 2013-06-15T19:40:26.193 に答える