一.装饰器的简易版本
# 统计函数的执行时间
import time
def index():
time.sleep(2)
print('from index')
def home():
time.sleep(3)
print('from home')
def outer(func):
# func = index
def get_time():
# 1. 统计一下函数执行前的时间戳
start_time = time.time()
func()
# 2. 统计一下函数执行完之后的时间戳
end_time = time.time()
# 3. 计算差值
print('函数执行时间:%s' % (end_time - start_time))
return get_time
index = outer(index) # res=>get_time的内存地址
index() # get_time()
二.装饰器进阶版本
def outer(func):
# func = index
def get_time(*args, **kwargs):
# 1. 统计一下函数执行前的时间戳
start_time = time.time()
func(*args, **kwargs) # login()
# 2. 统计一下函数执行完之后的时间戳
end_time = time.time()
# 3. 计算差值
print('函数执行时间:%s' % (end_time - start_time))
return get_time
login = outer(login) # res=>get_time的内存地址
login('ly') # get_time()
index=outer(index)
index()
三.解决函数返回值的问题
def login(name):
time.sleep(1)
print('from home', name)
return 'from login'
def outer(func):
# func = index
def get_time(*args, **kwargs):
# 1. 统计一下函数执行前的时间戳
start_time = time.time()
res=func(*args, **kwargs) # login()
# 2. 统计一下函数执行完之后的时间戳
end_time = time.time()
# 3. 计算差值
print('函数执行时间:%s' % (end_time - start_time))
return res
return get_time
login = outer(login) # res=>get_time的内存地址
res=login('ly') # get_time()
print(res)
四.装饰器固定模板
def outer(func):
def inner():
print('函数执行之前要执行的代码')
res = func()
print('函数执行之后要执行的代码')
return res
return inner
五.装饰器的语法糖
def outer(func):
def inner():
start_time = time.time()
res = func()
end_time = time.time()
print('函数执行时间:%s' % (end_time - start_time))
return res
return inner
# 统计函数的执行时间
@outer # # index = outer(index)
def index():
time.sleep(3)
print('from index')
index()
'''
装饰器语法糖的执行流程:
把语法糖下面紧贴着的函数名当成参数传递给装饰器函数参数
'''
@outer # home = outer(home)
def home():
print('from home')
home()
六.装饰器双层语法糖
# 统计函数执行时间的装饰器
import time
def get_time(func):
def inner():
start_time = time.time()
res = func()
end_time = time.time()
print('函数执行时间:%s' % (end_time - start_time))
return res
return inner
# 认证装饰器
def login_auth(func):
# func = index
def auth():
# 1. 让用户输入用户名和密码
username = input('username:').strip()
password = input('password:').strip()
# 2. 判断用户名和密码
if username == 'ly' and password == '123':
func() # inner()
else:
print('输入错误,不能调用函数')
return auth # 一定别忘记把内层函数的函数名返回出去
@login_auth # index=login_auth(inner) #index=>auth的内存地址
@get_time # inner=get_time(index)
def index(): # def auth()
time.sleep(2)
print('from index')
index() # auth()
七.有参装饰器
# 认证装饰器
def outter(source_data, a, b,c):
# source_data = 'file'
def login_auth(func):
# func = index
def auth( *args, **kwargs):
# 1. 让用户输入用户名和密码
# username = input('username:').strip()
# password = input('password:').strip()
if source_data == 'file':
print('从文件中读数据')
elif source_data =='mysql':
print('从mysql中读取数据')
elif source_data == 'oracle':
print('从oracle中读取数据')
return auth # 一定别忘记把内层函数的函数名返回出去
return login_auth
@outter('file', 1, 2,3) # outter('file') @login_auth
def index():
pass
index()