一、叠加装饰器
定义:在同一个被装饰对象,添加多个装饰器,并执行。
叠加装饰器的装饰顺序与执行顺序
装饰顺序:由下往上装饰。
执行顺序:由上往下执行。
注意:装饰器在调用被装饰对象时才会执行添加功能。
def wrapper1(func):
def inner1(*args,**kwargs):
print('1')
res = func(*args,**kwargs)
print('2')
return res
return inner1
def wrapper2(func):
def inner2(*args,**kwargs):
print('3')
res = func(*args,**kwargs)
print('4')
return res
return inner2
def wrapper3(func):
def inner3(*args,**kwargs):
print('5')
res = func(*args,**kwargs)
print('6')
return res
return inner3
@wrapper1 #inner1 = wrapper1(inner2)
@wrapper2 #inner2 = wrapper2(inner3)
@wrapper3 #inner3 = wrapper3(foo)
def foo():
print('from foo')
foo()
二、有参装饰器
def wrapper(user):
def outer(func): #func = foo
def inner(*args,**kwargs):
if user == 'f':
print('welcome haha') #添加用户的功能
res = func(*args,**kwargs) #func() = foo()
return res
elif user == 'k':
print('sorry neinei') #添加用户的功能
res = func(*args,**kwargs) #func() = foo()
return res
return inner
return outer
@wrapper("k") #outer = wrapper(foo)
def foo(): #被装饰对象
print('from foo')
foo()
三、wraps修复工具
#不导包的样子
# def wrapper(func):
# def inner(*args,**kwargs):
# '''
# 这是装饰器的注释
# :param args:
# :param kwargs:
# :return:
# '''
# res = func(*args,**kwargs)
# return res
# return inner
# @wrapper
# def foo():
# '''
# 这是被装饰对象的注释
# :return:
# '''
# print('from foo')
# foo()
# print(foo) #<function wrapper.<locals>.inner at 0x0000000009E352F0> 此时是装饰器的注释
#导包之后
from functools import wraps
def wrapper(func):
@wraps(func) #修改名称空间 foo--->func
def inner(*args,**kwargs):
'''
这是装饰器的注释
:param args:
:param kwargs:
:return:
'''
res = func(*args,**kwargs)
return res
return inner
@wrapper
def foo():
'''
这是被装饰对象的注释
:return:
'''
print('from foo')
# foo()
print(foo.__doc__)