‘@’python decorator用来做类似于java中的方法重写的东西?

我是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)
上一篇:python – 如何通过flask.Blueprint.route装饰器传递类的自我?


下一篇:flask web 开发 --- 关于路由app.route