装饰器,wrap、inner
用于在不修改原函数代码的情况下增强其功能。以下是 10 个最常用的装饰器用法,涵盖函数增强、参数检查、缓存、日志、权限控制等场景
1.原函数 lunch(),加上面装饰器,@my_wrap
2.装饰器函数my_wrap(),里面传参就是原函数,参数命名可以随意,目前func,作用:负责接收原函数并返回包装后的函数。
3.再定义一个wrap()函数,实现了装饰器的核心功能(包裹原函数并添加逻辑)
def my_wrap(func):
def wrap(aaa):
print("午餐开始啦")
func(aaa)
print("午餐结束啦")
return wrap
@my_wrap
def lunch(food):
print("午餐是:",food)
lunch("noodle")
如果原函数传参为2个,则优化代码
如果引用装饰器的原函数有1个或多个参数,为适配,装饰器函数传参可以使用万能传参(*wargs,**kwargs)
def my_wrap(func):
def wrap(aaa,bbb):
print("午餐开始啦")
func(aaa,bbb)
print("午餐结束啦")
return wrap
@my_wrap
def lunch(food,exit):
print("午餐是:",food,exit)
lunch("noodle","rice")
def my_wrap(func):
def wrap(*wargs,**kwargs):
print("午餐开始啦")
func(*wargs,**kwargs)
print("午餐结束啦")
return wrap
@my_wrap
def lunch(food,exit):
print("午餐是:",food,exit)
lunch("noodle","rice")
打印结果:
午餐开始啦
午餐是: noodle rice
午餐结束啦
原函数,引用多个装饰器
import time
def my_wrap(func):
def wrap(*wargs,**kwargs):
print("午餐开始啦")
func(*wargs,**kwargs)
print("午餐结束啦")
return wrap
def timer(func):
def wrap(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("执行耗时: ",end - start)
return result
return wrap
@my_wrap
@timer
def lunch(food,exit):
print("午餐是:",food,exit)
lunch("noodle","rice")
打印结果:
午餐开始啦
午餐是: noodle rice
执行耗时: 0.0
午餐结束啦
浙公网安备 33010602011771号