函数装饰器
函数装饰器
无参装饰器:
1,开放封闭原则
对修改源代码是封闭的,对功能的扩展是开放的
总结:1,不修改源代码
2,不修改调用方式
目的:在遵循1和2原则的基础上扩展新功能
2,什么是装饰器:
在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能
装饰器与被装饰的对象均可以是任意可调用的对象
装饰器---》函数
被装饰对象---》函数
模版:def outer(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner
3,装饰器语法:用@接装饰器,在被装饰对象正上方另起一行
例: import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time() #起始时间
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time) #结束时间
return res
return wrapper
@timmer #index=timmer(index)
def index():
time.sleep(1)
print('welcome to index page')
return 122
@timmer # home=timmer(home)
def home(name):
time.sleep(2) #延迟2秒
print('welcome %s to home page' %name)
index()
home('egon')
当多个装饰器叠加使用时,使用顺序是从上到下
import time
current_user={
'username':None,
}
def auth(func):
def wrapper(*args,**kwargs):
if current_user['username']:
print('已经登陆过了')
res=func(*args,**kwargs)
return res
uname=input('用户名>>: ').strip()
pwd=input('密码>>: ').strip()
if uname == 'egon' and pwd == '123':
print('登陆成功')
current_user['username']=uname
res=func(*args,**kwargs)
return res
else:
print('用户名或密码错误')
return wrapper
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper
@timmer # timmer 统计的是auth+index的执行时间
@auth
def index():
time.sleep(1)
print('welcome to index page')
return 122
index()