3

我对 python 比较陌生,最近才接触到'@' python 装饰器。我知道它有很多用途,但我想澄清一下我对它的一种用途的理解,更具体地说,它在以下代码中的用途是否正确。

@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

asapp.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 回答