Day4_装饰器
装饰器:
#模板
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

浙公网安备 33010602011771号