本片笔记学习自:Improve Your Python: Decorators Explained
首先需要知道的两个点:
1.函数可以作为参数
2.函数可以返回函数(生产函数)前进
Can we create a function that takes a function as a parameter and returns a function as the result. Would that be useful?
这样我们就可以接收一个函数,然后将其封装好后送出另外一个函数出去。
- 例子
def currency(f):
def wrapper(*args, **kwargs):
return '$' + str(f(*args, **kwargs))
return wrapper
在字符串之前加上’$‘。
@currency
def price_with_tax(self, tax_rate_percentage):
"""Return the price with *tax_rate_percentage* applied.
*tax_rate_percentage* is the tax rate expressed as a float, like "7.0"
for a 7% tax rate."""
return price * (1 + (tax_rate_percentage * .01))
加上语法糖,表示price_with_tax已经被装饰,装饰的方式在currency中定义。
- 一点点的“副作用”
我们在装饰的同时也将函数变成了price_with_tax,.name 和.doc都会是currency的,我们需要对装饰器进行一些修改:
from functools import wraps
def currency(f):
@wraps(f)
def wrapper(*args, **kwargs):
return '$' + str(f(*args, **kwargs))
return wrapper
- 威力
装饰器的作用,一言以蔽之:
This notion of wrapping a function with additional functionality without changing the wrapped function is extremely powerful and useful.
Flask框架利用装饰器来给不同的路径添加不同的功能
@app.route('/')
def hello_world():
return 'Hello World!'
装饰器可以添加参数的,下一次讲类装饰器再讲。
看完下面你就知道装饰器的形式了:
用处: