装饰器:
#模板
def auth(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper
#遵循开放封闭原则:对扩展是开放的,对修改是封闭的。
#装饰器本身可以可以是任意可调用的对象,被装饰的对象本身也可以是任意可以调用的对象。
#装饰器遵循的原则:
1,不修改被装饰对象的源代码
2,不修改被调用对象的调用方法
#装饰器的目的:
在遵循1和2的原则的前提下,为其他函数添加新功能
#定义了一个函数,想在原函数的基础上增加一个统计函数运行时间的功能 import time def index(): print('Welcome to index') index() #首先用这个解决方式,这种方式不满足装饰器不改变原函数的规则 def wrapper(func): start=time.time() func() stop=time.time() print('run time is %s' %(stop-start)) wrapper(index)
利用下面这种方法,可以解决问题:
import time def index(): time.sleep(3) print('Welcome to index') def timmer(): func=index def wrapper(): start=time.time() func() stop=time.time() print('run time is %s' %(stop-start)) return wrapper index=timmer() index()
但是如果说想要添加多个功能的时候,我们需要将func=index这行注释:
import time def index(): time.sleep(3) print('Welcome to index') def home(): time.sleep(3) print('Welcome to home') def timmer(): #func=index def wrapper(): start=time.time() func() stop=time.time() print('run time is %s' %(stop-start)) return wrapper index=timmer(index) home=timmer(home) index()
我们可以将index=timmer(index) home=timmer(home)简写
#装饰器必须要写到被装饰器的正上方,并且单独一行 def timmer(): #func=index def wrapper(): start=time.time() func() stop=time.time() print('run time is %s' %(stop-start)) return wrapper #index=timmer(index) #home=timmer(home) @timmer import time def index(): time.sleep(3) print('Welcome to index') @timmer def home(): time.sleep(3) print('Welcome to home') index()
被装饰对象是有参函数:
要让装饰器的函数能够适应各种有参,无参,多参的函数。
我们可以再装饰其中加入(*args,**kwargs)
def timmer(): #func=index def wrapper(*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print('run time is %s' %(stop-start))
return res return wrapper #index=timmer(index) #home=timmer(home) @timmer import time def index(): time.sleep(3) print('Welcome to index')
return 123 @timmer def home(): time.sleep(3) print('Welcome to home')
#如果函数里边有返回值,例如我们在index()函数中有返回值,我们需要在上面的装饰器里边在定义一层,
res=func(),在结尾返回一个return res index()
实现认证功能的装饰器:
def auth(func): def wrapper(*args,**kwargs): name=input('input your name').strip() password=input('input your password').strip() if name == 'yangshuai' and password == '123': res=func(*args,**kwargs) return res else: print('login failed') return wrapper @auth def index(): print("login successful") index()
6-15:11