我是python的新手,刚刚接触过’@’python装饰器.我知道它有很多用途,但我想澄清一下,如果我对其中一个用途的理解更具体地用于下面的代码,是正确的.
@app.before_request
def before_request():
g.db = connect_db()
我在使用Flask时遇到了装饰器,我想知道python中的上述代码是否使用’@’装饰器来’覆盖”app’类中的’before_request’方法.我不知道python是否有任何其他形式的方法覆盖像java一样,但是因为我知道java,如果确实如此,我会更容易理解它.
解决方法:
在Python中,函数是第一类对象,因此它们可以作为参数传递.
为了清楚起见,我将重写您的功能:
@app.before_request
def f():
g.db = connect_db()
首先,app.before_request是功能.
这里发生的是以下内容:
def f():
g.db = connect_db()
f = app.before_request(f)
因此,函数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)