完美的装饰器和语法糖
一、wraps
一般的装饰器公式:只对原函数加功能,但名字等属性为函数warpper
无参装饰器:
def index(func):
def warpper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return warpper
@index
def func(x):
print(x)
print(func.__name__)
===》warpper
加上wraps全面包装成原函数属性:需要提取模块
from functools import wraps
def timmer(func):
@wraps(func)
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return
return wrapper
@timmer # index= timmer(index) # index=wrapper
def index():
print('from index')
print(index.__name__)
===>index
wrapper装饰太麻烦了,而且平常没啥用就很少使用。
二、装饰器生成式
语法糖就是@ 放在被装饰的函数上@后加上装饰器的名字,自动完成包装
1、有参装饰器公式:
def outter(x):
def index(func):
def warpper(*args,**kwargs):
print(x)
res=func(*args,**kwargs)
print(3)
return res
return warpper
return index
@outter(1)
def f():
print(2)
f()
====>
1
2
3
2、多个迭代器的叠加使用:
def outter1(func1): # func1 = wrapper2的内存地址
print('============>outter1')
def wrapper1(*args,**kwargs):
print('============>wrapper1')
res1=func1(*args,**kwargs)
return res1
return wrapper1
def outter2(func2): # func2 = wrapper3的内存地址
print('============>outter2')
def wrapper2(*args,**kwargs):
print('============>wrapper2')
res2=func2(*args,**kwargs)
return res2
return wrapper2
def outter3(func3): # func3 = 被装饰函数也就是index的内存地址
print('============>outter3')
def wrapper3(*args,**kwargs):
print('============>wrapper3')
res3=func3(*args,**kwargs)
return res3
return wrapper3
# index = wrapper1的内存地址
@outter1 # outter1(wrapper2的内存地址)->wrapper1的内存地址
@outter2 # outter2(wrapper3的内存地址)->wrapper2的内存地址
@outter3 # outter3(被装饰函数也就是index的内存地址)->wrapper3的内存地址
def index():
print('from index')
===>>
============>outter3
============>outter2
============>outter1