装饰器
1) 示例:使用装饰器,判断程序运行的时间
#前提
import time
def index():
print('hello word lalala')
time.sleep(3) # 假如这个程序需要运行3s
index()
#方案一:修改了源代码(不可)
import time
def index():
start=time.time()
print('hello world lalala')
time.sleep(3)
stop=time.time()
print(stop-start)
index()
# hello world lalala
# 3.0051140785217285 # 设定的时间3s
# 方案2:反复写代码,反复一串代码调用
import time
def index():
print('hello world lalala')
time.sleep(3)
start=time.time()
index()
stop=time.time()
print(stop-start)
# 方案3:基于方案2,把调用的那一串代码定一个函数,直接调用函数
# 缺点:写死了调用的函数,只能调用index,执行index函数的那一串代码;而且改变了调用方式,不再是调用index()
import time
def index():
print('hello world lalala')
time.sleep(3)
def wrapper():
start=time.time()
index()
stop=time.time()
print(stop-start)
wrapper()
# hello world lalala
# 3.005214214324951
# 方案4:
import time
def index():
print('hello world lalala')
time.sleep(3)
def outter(func): #func是一个参数(这里的参数是一个函数),就不会把上面的indx函数写死
def warpper():
start=time.time()
func() # 调用参数(即一个函数)
stop=time.time()
print(stop-start)
return warpper # return返回warpper,其实执行outter这个函数就是调用wrapper
index=outter(index) #index可以起其他任意名字,但是还是叫index,就不会改变调用方式
print(index)
# <function outter.<locals>.warpper at 0x1007af790> # 调用的函数地址(注意这里不是原来的index的函数值,是wrapper的内存地址)
index()
# hello world lalala
# 3.0009541511535645
# 方案5:(最终方案) (加入了参数,源代码额返回值也会返回,给用户还是在用源代码的感觉)
import time
def index(x,y,z):
print('hello world lalala')
time.sleep(3)
return x,y,z
def outter(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print(stop-start)
return res
return wrapper
index=outter(index)
res=index(1,2,3) #res可以随便定义
print(res)
# hello world lalala
# 3.005371332168579
# (1, 2, 3) # 返回值一起得到(相当于源代码执行结果一样)
# 以上如果要调用其他的函数,调用一样功能查看运行时间,只需要如下
调用函数名=outter(调用函数名)
res=函数名(参数)
print(res)
2) 总结 -- 装饰器
## 百搭装饰器
# def outter(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
inp_name=input('username:')
inp_pwd=input('password:')
if inp_name == 'mz' and inp_pwd == '123':
res=func(*args,**kwargs)
return res
else:
print('认证失败')
return wrapper
@outter # 相当于home=outter(home)
def home(name): # 这里的name给 print('hello %s' % name) 使用返回值用
res='这是home函数'
print('hello %s' % name)
return [res]
res=home('mz')
print(res)
# username:mz
# password:123
# hello mz
# ['这是home函数']
res=home('egon')
print(res)
# username:mz
# password:123
# hello egon
# ['这是home函数']
res=home('bb')
print(res)
# username:bbbbbbb
# password:123456
# 认证失败
# None
网友评论