ano*_*428 3 python java decorator flask
我是python的新手,刚刚接触过'@'python装饰器.我知道它有很多用途,但我想澄清一下,如果我对其中一个用途的理解更具体地用于下面的代码,是正确的.
@app.before_request
def before_request():
g.db = connect_db()
Run Code Online (Sandbox Code Playgroud)
我在使用Flask时遇到了装饰器,我想知道python中的上述代码是否使用'@'装饰器来'覆盖''app'类中的'before_request'方法.我不知道python是否有任何其他形式的方法覆盖像java一样,但是因为我知道java,如果确实如此,我会更容易理解它.
在Python中,函数是第一类对象,因此它们可以作为参数传递.
为了清楚起见,我将重写您的功能:
@app.before_request
def f():
g.db = connect_db()
Run Code Online (Sandbox Code Playgroud)
首先app.before_request是功能.
这里发生的是以下内容:
def f():
g.db = connect_db()
f = app.before_request(f)
Run Code Online (Sandbox Code Playgroud)
因此,功能app.before_request应用于功能f.
正如app.before_request用作装饰器,app.before_request再次分配结果f.但在这种情况下并不重要.什么是不可靠的是app.before_request内部f使用它来使用它.
装饰器仅用于描述它的简洁和美观的方式.
您可以通过此代码实现相同的功能(我认为它比具有装饰器的代码更不易读取):
def f():
g.db = connect_db()
app.before_request(f)
Run Code Online (Sandbox Code Playgroud)