记录下python装饰器的作用,经常忘记这个,又回想不起来,肯定是因为少用。
先上个简单的装饰器例子
from functools import wraps
def other_fun(func):
print("开始执行other_fun")
@wraps(func)
def warrp():
print("开始执行warrp")
func()
print("执行完warrp")
return warrp
@other_fun
def myfun():
print("myfun")
myfun()
打印结果:
开始执行other_fun
开始执行warrp
myfun
执行完warrp
简单的装饰器等同于将函数myfun()传参到other_fun()执行 myfun = other_fun(myfun)
- 装饰器本质,或者从代码结构上说,可以认为就是一个闭包
- 都是利用了Python函数本身既可以嵌套、又可以接受函数参数、又可以返回一个函数的特点
- 只是闭包偏向于利用内存常驻的特点,而装饰器偏向于利用函数返回函数的特点
我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成, 且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。
上第二个例子,带参数的装饰器
def other_fun(func):
print("开始执行other_fun")
def warrp(num):
print("开始执行warrp")
result = func(num)
print("执行完warrp")
return print(result)
return warrp
def myfun(num):
print("myfun")
return num
test = other_fun(myfun)
test(101)
开始执行other_fun
开始执行warrp
myfun
执行完warrp
101
我们看到了一个闭包与函数传参的例子,那么装饰器 其实就是闭包+函数传参,如果上面的例子你看懂了,那么现在你只需要对代码格式稍作修改,就变成了一个装饰器 执行起来语法更简洁美观了
def other_fun(func):
print("开始执行other_fun")
@wraps(func)
def warrp(*args):
print("开始执行warrp")
result = func(*args)
print("执行完warrp")
return print(result )
return warrp
@other_fun
def myfun(num):
print("myfun")
return num
myfun(101)
开始执行other_fun
开始执行warrp
myfun
执行完warrp
101
通过引入functools方法中的wraps,保证了原函数的原始性与完整性 @wraps 接受一个函数,进行装饰,并加入了复制函数名称、注释文档、参数列表等功能,这样可以是我们在装饰器里面访问在装饰之前的函数的属性
装饰器的应用,日志记录 。。。待续
|