否则会导致,代码冗余,结构不清晰,可扩展性差
‘‘‘ 叠加装饰器: 在同一个被装饰对象中,添加多个装饰器,并执行。 @装饰1 @装饰2 @装饰3 def 被装饰对象(): pass 注意: 装饰器在调用被装饰对象时才会执行添加的功能。 - 叠加装饰器: - 装饰的顺序: 由下到上装饰 - 执行的顺序: 由上往下 注意: 无论inner中出现任何判断,最后都要返回“调用后的被装饰对象” func(*args, **kwargs) ‘‘‘ def wrapper(func): def inner(*args, **kwargs): # 注册 res = func(*args, **kwargs) # 登录 return res return inner
def wrapper1(func): def inner1(*args, **kwargs): print(‘1---start‘) # 被装饰对象在调试时,如果还有其他装饰器,会先执行其他装饰器中的inner # inner2 res = func(*args, **kwargs) print(‘1---end‘) return res return inner1 def wrapper2(func): def inner2(*args, **kwargs): print(‘2---start‘) res = func(*args, **kwargs) print(‘2---end‘) return res return inner2 def wrapper3(func): def inner3(*args, **kwargs): print(‘3---start‘) res = func(*args, **kwargs) print(‘3---end‘) return res return inner3 ‘‘‘ 叠加装饰器的装饰顺序与执行顺序: - 装饰顺序: 调用wrapper装饰器拿到返回值inner 由下往上装饰 - 执行顺序: 调用装饰过后的返回值inner 由上往下执行 ‘‘‘ @wrapper1 # index《---inner1 = wrapper1(inner2) @wrapper2 # inner2 = wrapper2(inner3) @wrapper3 # inner3 = wrapper3(index) def index(): # 被装饰对象 # inner1 ---》 print(‘from index...‘) # 正在装饰 inner3 = wrapper3(index) inner2 = wrapper2(inner3) inner1 = wrapper1(inner2) ‘‘‘ inner1() inner2() inner3() index() ‘‘‘ index() # 此处执行 # inner1() --> inner2() ---> inner3()
#有参装饰器: 在某些时候,我们需要给用户的权限进行分类
‘‘‘
以下是有参装饰器
@wrapper1(参数1) # inner1 = wrapper1(inner2)
@wrapper2(参数2) # inner2 = wrapper2(inner3)
@wrapper3(参数3)
‘‘‘
# 有参装饰器 def user_auth(user_role): # ‘SVIP‘ def wrapper(func): def inner(*args, **kwargs): if user_role == ‘SVIP‘: # 添加超级用户的功能 res = func(*args, **kwargs) return res elif user_role == ‘普通用户‘: print(‘普通用户‘) # 添加普通用户的功能 res = func(*args, **kwargs) return res return inner return wrapper # 被装饰对象 # @user_auth(‘SVIP‘) wrapper = user_auth(‘普通用户‘) @wrapper # @user_auth(‘SVIP‘) # wrapper = user_auth(‘普通用户‘) @wrapper #<--- 返回结果(wrapper) <---- user_auth() def index(): pass
‘‘‘ wraps: (了解) 是一个修复工具,修复的是被装饰对象的空间。 from functools import wraps ‘‘‘ from functools import wraps def wrapper(func): @wraps(func) # 修改名称空间: inner ---》 func def inner(*args, **kwargs): ‘‘‘ 此处是装饰器的注释 :param func: :return: ‘‘‘ res = func(*args, **kwargs) return res return inner # ---》 func @wrapper def index(): ‘‘‘ 此处是index函数的注释 :return: ‘‘‘ pass print(index) # 函数对象 # 函数对象.__doc__: 查看函数内部的注释 print(index.__doc__) # inner.__doc__
原文:https://www.cnblogs.com/lvguchujiu/p/11852092.html