装饰器——有参装饰器
有参装饰器:
是为装饰器提供多样功能选择的实现提供的,实现原理是三层闭包。
有参装饰器的基本模板:
def outter(x): def outter1(func): def wrapper(*args,*kwargs): res = func(*args,**kwargs) print(x) return res return wrapper return outter1
通过第三层进行传值,使得有参装饰器可以使用其他参数,实现其他功能。
有参装饰器的魔法糖
@outter('msj') #可以被看做 #f1 = outter1(f1) #f1 = wrapper(*args,**kwargs)
有参装饰器的实例:
def auth2(engine='file'): def auth(func): def wrapper(*args,**kwargs): if user_info['current_user'] is not None: res=func(*args,**kwargs) return res inp_user=input('username>>>: ').strip() inp_pwd=input('password>>>: ').strip() if engine == 'file': print('基于文件的认证') if inp_user == 'egon' and inp_pwd == '123': # 记录登录状态 user_info['current_user']=inp_user print('login successful') res=func(*args,**kwargs) return res else: print('user or password error') elif engine == 'mysql': print('基于mysql数据的认证') elif engine == 'ldap': print('基于ldap的认证') else: print('无法识别认证源') return wrapper return auth @auth2(engine='mysql') # @auth ===> index=auth(最原始那个index的内存地址)===》index=wrapper def index(): """这是index功能""" print('welcome to index page') time.sleep(2) return 123 @auth2(engine='file') def home(name): """这是home功能""" print('welcome %s to home page' %name) time.sleep(1) index() #wrapper() home('egon')
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步