修饰器
2024.4.2 修饰器
简化
import time
def time_sleep(): #函数停止运行多长时间
start = time.time()
time.sleep(5)
print('from time_sleep ')
end = time.time()
print(end - start)
time_sleep()
增加功能
import time
def time_sleep(): #函数停止运行多长时间
time.sleep(1)
print('from time_sleep ')
def time_count(func):
start = time.time()
func()
end = time.time()
print(end - start)
time_count(time_sleep) #改变调用方式,但是变得复杂
装饰器:
改变功能的时候不改变原来的调用方式,并且不改变原来函数的代码
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
装饰器本身也是一种函数
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=deco(time_sleep)
time_sleep #time_sleep()=wrapper(),加上()表示函数被调用,可以去掉,也可以删去(),要不然python3.9会报错
带参数的
import time
def time_sleep(name,age,gender='male',height=18): #函数停止运行多长时间
time.sleep(1)
print('name:',name,'age:',age,'gender:',gender,'height',height)
print('from time_sleep ')
return 'adam'
def deco(func): #装饰器
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('ADAM','18')
print(res)
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
语法糖
import time
def deco(func): #装饰器
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,gender='male',height=18): #函数停止运行多长时间
time.sleep(1)
print('name:',name,'age:',age,'gender:',gender,'height',height)
print('from time_sleep')
return 'adam'
res=time_sleep('ADAM','20')
print(res)
登录装饰器
userinfo_dict={'adm':'111'}
is_login =False #全局变量,所以使用global,改变变量
'''或者使用可变变量'''
def login(func):
def wrapper(*args,**kwargs):
global is_login
if not is_login:
username = input('用户名>>>').strip()
pwd = input('密码>>>').strip()
if pwd == userinfo_dict.get(username):
print('登陆成功')
is_login=True
res=func(*args,**kwargs)
return res
print('登录失败')
else:
res = func(*args, **kwargs)
return res
return wrapper
@login
def shopping():
print('shopping')
@login
def withdraw():
print(withdraw)
@login
def pay():
print('pay')
shopping()
pay()
三层装饰器
def sanceng(name,age):
def deco(func):
print(name)
def wrapper(*args,**kwargs):
print(name)
res=func(*args,**kwargs)
return res
return wrapper
return deco
deco=sanceng(name,age)
time_sleep=deco(time_sleep)
time_sleep()
浙公网安备 33010602011771号