1. 什么是装饰器 器=》工具 装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=》函数 被装饰器本身也可以是任意可调用的对象=》函数 目标:写一个函数来为另外一个函数来添加一个新功能 2.为何要用装饰器 开放封闭原则:然间一旦上线就应该对修改封闭,对扩展开放 对修改封闭: 1.不能修改功能的源代码 2.也不能修改功能的调用方式 对扩展开放: 可以为原有功能添加新的功能 目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能 3.如何要用装饰器 1.无参装饰器的模板: from functools import wraps def outter(func): @wraps(func) def rapp(*args,**kwargs): return rapp 2.def cert(cert_type=‘file‘): def timeer(func): def times(*args,**kwargs): if login_status[‘user‘]: res=func(*args, **kwargs) return res if cert_type==‘file‘: dic_11 = input(‘用户名>>:‘) dic_22 = input(‘密码>>:‘) if dic_11 in user["name"] and dic_22 in user["password"]: login_status[‘user‘]=dic_11 res = func(*args, **kwargs) return res else: print(‘用户名或者密码错误‘) return times return timeer # 装饰器的语法糖:在被装饰对象正上方单独一行写@装饰器的名字# 运行原理:# python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数#传给装饰器,最后将装饰器调用的结果赋值给原函数名 # import time## def timmer(func): #func=最原始那个home函数的内地址# def wrapper(*args,**kwargs): #args=(‘egon‘,) kwargs={}# start=time.time()# res=func(*args,**kwargs) #最原始那个home函数的内地址(‘egon‘)# stop=time.time()# print(‘run time is %s‘ %(stop - start))# return res# return wrapper## @timmer #index=timmer(index)# def index():# print(‘welcome to index page‘)# time.sleep(3)## @timmer #home=timmer(home)# def home(name):# print(‘welcome %s to home page‘ %name)# time.sleep(2)# return 123## index()# res=home(‘egon‘) # res=wrapper函数的内地址(‘egon‘)# print(res)## import time # 装饰器模板def outter(func): def wrapper(*args,**kwargs): #在调用函数前加功能 res=func(*args,**kwargs) #调用被装饰的\也就是最原始的那个函数 #在调用函数后加功能 return res return wrapper @outter #index=outter(index) #index=wrapperdef index(): print(‘welcome to index page‘) time.sleep(3) index() 叠加多个装饰器 # 解释@语法的时候是自下而上运行# 而执行装饰器内的那个wrapper函数时的是自上而下@timmer # index=timmer(wrapper2) #index=wrapper1@auth # index=auth(最原始的那个index的内存地址) #index=wrapper2def index(): print(‘welcome to index page‘) time.sleep(3) index() #wrapper1() ‘‘‘ # import time## def timmer(func):# print(‘timmer‘)# def wrapper1(*args,**kwargs):# start=time.time()# res=func(*args,**kwargs) #res=wrapper2(*args,**kwargs)# stop=time.time()# print(‘run time is %s‘ %(stop - start))# return res# return wrapper1## def auth(func):# print(‘auth‘)# def wrapper2(*args,**kwargs):# inp_user = input(‘please input your username: ‘).strip()# inp_pwd = input(‘please input your password: ‘).strip()# if inp_user == ‘egon‘ and inp_pwd == ‘123‘:# print(‘login successfull‘)# res=func(*args,**kwargs) # 调用最原始的那个/也就是被装饰的那个函数# return res# else:# print(‘username or password error‘)# return wrapper2### @auth # index=auth(wrapper1) #index=wrapper2# @timmer #timmer(最原始的index)返回wrapper1# def index():# print(‘welcome to index page‘)# time.sleep(3)## index() #wrapper2()# import time def outter1(func1): #func1=wrapper2 print(‘outter1‘) def wrapper1(*args,**kwargs): print(‘wrapper1‘) res1=func1(*args,**kwargs) #res1=wrapper2(*args,**kwargs) return res1 return wrapper1 def outter2(func2): #func2=最原始的那个index的内存地址 print(‘outter2‘) def wrapper2(*args,**kwargs): print(‘wrapper2‘) res2=func2(*args,**kwargs) return res2 return wrapper2 @outter1 # index=outter1(wrapper2) #index=wrapper1@outter2 #outter2(最原始的那个index的内存地址) ===> wrapper2def index(): print(‘welcome to index page‘) time.sleep(3) index() #wrapper1() ‘‘‘outter2outter1wrapper1wrapper2 有参函数 def login(engine=‘file‘): #engine=‘mysql‘ def auth(func): #func=最原始那个index的内存地址 def wrapper(*args,**kwargs): if current_user[‘username‘]: print(‘已经登录过了,无需再次登陆‘) res=func(*args,**kwargs) return res if engine == ‘file‘: inp_user = input(‘please input your username: ‘).strip() inp_pwd = input(‘please input your password: ‘).strip() if inp_user == ‘egon‘ and inp_pwd == ‘123‘: print(‘login successfull‘) current_user[‘username‘]=inp_user # 在登陆成功之后立刻记录登录状态 res=func(*args,**kwargs) # res=最原始那个index的内存地址(*args,**kwargs) return res else: print(‘username or password error‘) elif engine == ‘mysql‘: print(‘基于mysql的认证机制‘) elif engine == ‘ldap‘: print(‘基于ldap的认证机制‘) else: print(‘无法识别的认证源‘) return wrapper return auth @login(‘file‘) #@auth # index=auth(最原始那个index的内存地址) #index=wrapperdef index(): print(‘welcome to index page‘) time.sleep(3) @login(‘file‘)def home(name): print(‘welcome %s to home page‘ %name) time.sleep(2) return 123 index() #wrapper()res=home(‘egon‘)print(res) # 有参装饰器的模板def outter1(x,y,z): def outter2(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper return outter2 补充:所有的数据类型的值自带布尔值,可以直接当作条件去用,只需要记住布尔值为假的那一些值即可(0,空,None)
原文地址:https://www.cnblogs.com/yanhui1995/p/9715262.html
时间: 2024-10-13 22:34:18