7.2 装饰器
7.2 装饰器
装饰器:装饰的工具,而工具又是由函数来定义。所以,装饰器本质上也是一个函数,只不过这个函数具有装饰功能。
import time
#睡眠1秒
def time_sleep():
time.sleep(1)
#睡眠1秒打印1
time_sleep()
print(1)
#再睡眠1秒打印2
time_sleep()
print(2)
# print(time.time()) #打印当前时间
start =time.time()
time.sleep(5)
end =time.time()
print(end-start) #输出间隔时长
5.001065015792847
#将计算间隔时长功能写成函数,对time.sleep()计时.
def time_sleep():
start =time.time()
time.sleep(5)
end =time.time()
print('from time_sleep')
print(end-start)
#每个函数如果都要统计间隔时长,这样写一遍太复杂
#因此基于上述代码改进
#定义计算执行间隔时长函数,传入函数类型参数,统计该函数间隔时长。
def time_count(func):
start =time.time()
func()
end =time.time()
print(end-start)
def time_sleep1():
time.sleep(1)
print('from time_sleep1')
def time_sleep2():
time.sleep(2)
print('from time_sleep2')
time_count(time_sleep1)
time_count(time_sleep2)
from time_sleep
1.0007519721984863
from time_sleep
2.0007483959198
虽然上述代码实现了新功能但却需要重新调用,便引入了装饰器。
装饰器:改变功能的时候不改变原来的调用方式,并且不改变原来函数的代码
7.2.1 基础装饰器
import time
def time_sleep():
time.sleep(1)
print('from time_sleep')
#最基础的装饰器
def deco(func):
def wrapper():
start =time.time()
func()
end =time.time()
print(end-start)
return wrapper
#添加装饰器后的time_sleep
time_sleep=deco(time_sleep) #wrapper
time_sleep() #wrapper()
from time_sleep
1.0006792545318604
7.2.2 完善装饰器
- 带有返回值的装饰器
import time
def time_sleep():
time.sleep(1)
print('from time_sleep')
return 'timesleep'
def deco(func):
def wrapper():
start=time.time()
res=func()
end=time.time()
print(end-start)
return res
return wrapper
time_sleep=deco(time_sleep)
res=time_sleep()
print(res)
from time_sleep
1.000774621963501
timesleep
- 带有参数的装饰器
#3.2 参数的
def time_sleep(name,age,height='185'):
time.sleep(1)
print('from time_sleep')
print(f'name:{name},age:{age},height:{height}')
return 'timesleep'
def deco(func): #func=原来的time_sleep
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #接收所有参数
end=time.time()
print(end-start)
return res
return wrapper
time_sleep=deco(time_sleep)
res=time_sleep('coco',18)
print(res)
from time_sleep
name:coco,age:18,height:185
1.0009222030639648
timesleep
7.2.3 装饰器补充
#装饰器模版
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
#语法糖让代码写的简单
def deco(func): #func=原来的time_sleep
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #接收所有参数
end=time.time()
print(end-start)
return res
return wrapper
@deco #time_sleep=deco(time_sleep)
def time_sleep(name,age,height='185'):
time.sleep(1)
print('from time_sleep')
print(f'name:{name},age:{age},height:{height}')
return 'timesleep'
res=time_sleep('coco',18)
print(res)
from time_sleep
name:coco,age:18,height:185
1.000589370727539
timesleep
7.2.4 装饰器应用
# 模版
# def deco(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper
userinfo_dict={'coco':'123'}
is_login=False
# is_login_list=[False] #一般不用可变类型
#登录装饰器
def login(func):
def wrapper(*args,**kwargs):
global is_login #声明全局变量在局部第一次使用之前
if not is_login:
username=input('请输入你的用户名>>')
pwd=input('请输入你的密码>>')
if pwd==userinfo_dict.get(username):
print('登陆成功')
is_login=True
# is_login_list[0]=True #局部无法修改规则不适用于可变类型,使用全局变量声明,不建议使用可变类型。
res=func(*args,**kwargs)
return res
else:
print('登录失败')
else:
res=func(*args,**kwargs)
return res
return wrapper
@login
def shopping():
print('from shopping')
@login
def pay():
print('from pay')
@login
def withdraw():
print('from withdraw')
# shopping()
withdraw()
请输入你的用户名>> coco
请输入你的密码>> 123
登陆成功
from withdraw
7.2.5 三层装饰器
- 三层装饰器:两层装饰器需要参数,给装饰器这个函数传参。
def time_sleep():
time.sleep(1)
print('from time_sleep')
return 'time_sleep'
#三层装饰器
def sanceng(name): #第三层装饰器为了传参用
print(name)
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return deco
deco=sanceng('coco')
time_sleep=deco(time_sleep)
time_sleep()
coco
from time_sleep
'time_sleep'
浙公网安备 33010602011771号