1 装饰器函数的本质:一个闭包函数
2 装饰器的作用:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
3 语法糖 : 格式 :@装饰器名称
4 创建带返回值的装饰器
5 创建传递参数的装饰器
6 装饰器的固定格式
def wrapper(f):
def inner(*args,**kwargs):
#被装饰器函数之前执行的代码
ret = f(*args,**kwargs)
# 被装饰的函数执行之后的代码
return ret
return inner
@wrapper
def fun(*args,**kwargs):
print('zzz')
7 解决被装饰器函数不能查看信息bug
导入 wraps
from functools import wraps
@wraps(func)
8添加多个装饰器
格式:
@wrapper1
@wrapper2
def f():
执行原理:先执行距离函数近的装饰器@wrapper2
练习1 :创建一个计算函数执行花费时间的闭包函数。
#功能函数
import time
def fun():
print('感谢cctv,感谢人民感谢党')
#闭包函数
def timer(func):
def inner():
start = time.time()
time.sleep(1)
func()
end = time.time()
print(end - start)
return inner()
fun = timer(fun)
"""
感谢cctv,感谢人民感谢党
1.0000572204589844
"""
练习2 使用语法糖修改timer()装饰器
import time
def timer(func):
def inner():
start = time.time()
time.sleep(1)
func()
end = time.time()
print(end - start)
return inner()
#语法糖 : @装饰器名称 等价于fun = timer(fun)
@timer
def fun():
print('感谢cctv,感谢人民感谢党')
#调用函数
fun()
练习 3 创建一个带返回值的装饰器 (错误版)
练习4 创建一个带返回值的装饰器 正确版
import time
def timer(func):
def inner():
start = time.time()
time.sleep(1)
#接受返回值
ret = func
end = time.time()
print(end - start)
#返回返回值
return ret
return inner()
@timer
def fun():
print('xxx')
return 'ok...'
ret = fun
print(ret)
练习5 创建一个带参数的装饰器
import time
def timer(func):
#1 传递参数
def inner(s):
start = time.time()
time.sleep(1)
#2 传递参数
func(s)
end = time.time()
print(end - start)
return inner
@timer
def fun(s):
print('xxx',s)
fun('ooo')
练习 6 定义一个可以传递任意参数的装饰器
import time
def timer(func):
def inner(*args, **kwargs):
start = time.time()
time.sleep(1)
func(*args, **kwargs)
end = time.time()
print(end - start)
return inner
@timer
def fun(*args, **kwargs):
print('传递过来的参数是:', *args, **kwargs)
fun('ooo', 'zs', '张三')
练习 7 使用@wraps(func)解决被装饰函数的信息必能查看问题
import time
from functools import wraps # 导入warps
def timer(func):
@wraps(func)
def inner(*args, **kwargs):
start = time.time()
time.sleep(1)
func(*args, **kwargs)
end = time.time()
print(end - start)
return inner
@timer
def fun(*args,**kwargs):
"""
:param args: 位置参数
:param kwargs: 关键词参数
:return: 无返回值
"""
print('传递过来的参数:'*args,**kwargs)
fun('aa','bb')
print(fun.__doc__)
print(fun.__name__)