装饰器利用了闭包的原理。
以下原则需要注意,只能在外围增减功能,但是内部是不能动的。
语法糖:
获取函数的返回值:
装饰带参数的函数:
这里是装饰器函数
假如你想装饰一个带参数的函数,如下:
def func(para):
print(para)
将我们的函数func交给装饰器函数处理,装饰器函数返回给我们的是具有传参能力的inner()。
我们利用这个inner(),传递参数a,实际上还是去调用func(a),也就是实现了对带有参数的函数进行装饰。
装饰一个可以接收任意参数的函数
跟前面传一个参数a是一样的原理。
问题:打印func的名字时,发现为inner。
这就违背了装饰器的初衷:不修改原函数的任何功能和属性。
使用wraps后,就能让func的名字是func。
其实就是对inner函数又做了一次装饰。这次使用了wraps这个装饰器函数。
所以,到目前为止,最完整的装饰器模板是:
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
print('......')
ret = func(*args, **kwargs)
print('......')
return ret
return inner
@wrapper
def function(para):
print(para)
return 1
result = function(5)
print(result)