'@';python decorator用于执行类似于java中的方法重写的操作?

'@';python decorator用于执行类似于java中的方法重写的操作?,java,python,flask,decorator,Java,Python,Flask,Decorator,我对python比较陌生,最近刚刚接触了“@”python装饰程序。我知道它有很多用途,但我想澄清一下,我对它的一个用途的理解是否正确,更具体地说,就是它在下面代码中的用法 @app.before_request def before_request(): g.db = connect_db() 我在使用Flask时遇到了decorator,我想知道python中的上述代码是否使用“@”decorator来“重写”app类中的before_request方法。我不知道python是否有

我对python比较陌生,最近刚刚接触了“@”python装饰程序。我知道它有很多用途,但我想澄清一下,我对它的一个用途的理解是否正确,更具体地说,就是它在下面代码中的用法

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

我在使用Flask时遇到了decorator,我想知道python中的上述代码是否使用“@”decorator来“重写”app类中的before_request方法。我不知道python是否有任何其他形式的方法重写,比如java,但由于我了解java,如果确实是这样的话,我会更容易理解它。

在python中,函数是第一类对象,因此它们可以作为参数传递

为了清楚地解释以下内容,我将重写您的函数:

@app.before_request
def f():
    g.db = connect_db()
首先,
app.before\u request
是函数

这里发生的情况如下:

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

f = app.before_request(f)
因此,函数
app.before\u request
应用于函数
f

作为
app.before\u request
用作装饰器,将
app.before\u request
的结果再次分配给
f
。但在这种情况下,这并不重要。重要的是,
app.before\u request
在内部使用
f
来利用它

Decorator仅仅是为了简洁和美观地描述它

您可以通过以下代码实现同样的效果(我认为它的可读性不如使用decorator的代码):


好的,这比我读的文档更有意义。谢谢。装饰师一开始有点难以理解。但是当你试着和他们一起工作时,你会发现他们是一件非常简单的事情。请记住,Python中的函数可以像任何其他对象一样传递,而decorator只是在一条语句中应用和重新分配惟一的东西。
def f():
    g.db = connect_db()

app.before_request(f)