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

时间:2013-06-15 19:32:48

标签: java python flask decorator

我对python比较陌生,刚刚接触过' @'蟒蛇装饰。我知道它有很多用途,但我想澄清一下,如果我对其中一个用途的理解更具体地在下面的代码中使用它是正确的。

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

我在使用Flask时遇到了装饰器,我想知道python中的上述代码是否使用了' @'装饰者覆盖'方法' before_request'在“应用程序”中类。我不知道python是否有任何其他形式的方法覆盖像java一样,但是因为我知道java,如果确实如此,我会更容易理解它。

1 个答案:

答案 0 :(得分: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)

因此,函数app.before_request将应用于函数f

由于app.before_request用作装饰器,app.before_request的结果会再次分配给f。但在这种情况下并不重要。值得注意的是,app.before_request在内部使用f来制作内容。

Decorator仅用于描述它的简洁美观。

您可以通过此代码实现相同的功能(我认为它与具有装饰器的代码相比不太可读):

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

app.before_request(f)