在stackoverflow上面的一个问题,如果使用如下的代码:

@makebold
@makeitalic
def say():
return "Hello"

打印出如下的输出:

<b><i>Hello<i></b>

你会怎么做?最后给出的答案是:

def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print hello() ## 返回 <b><i>hello world</i></b>

装饰器是解决这类问题的绝佳设计,有了装饰器,可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能,它能够让你在装饰前后执行代码而无须改变函数本身内容。

如在Flask框架中URL路由:

from flask import Flask
app = Flask(__name__)
@app.route('/user/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
session['logged\_in'] = True
return redirect('/')
else:
return render_template('login.html')
@app.route('/user/logout')
def logout():
session['logged_in'] = False
return redirect('/user/login')