一、叠加装饰器
定义:在同一个被装饰对象,添加多个装饰器,并执行。
叠加装饰器的装饰顺序与执行顺序
装饰顺序:由下往上装饰。
执行顺序:由上往下执行。
注意:装饰器在调用被装饰对象时才会执行添加功能。
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__)