# 调用index函数,调用之前,需要输入用户名和密码,并且,用户名和密码必须输入正确
def home():
print('from home')
def login():
print('from login')
is_auth = {'is_login': False}
def login_auth(func):
# func = index
def auth():
# 判断是否已经认证成功了
if is_auth.get('username'):
res = func()
return res
# 1. 让用户输入用户名和密码
username = input('username:').strip()
password = input('password:').strip()
# 2. 判断用户名和密码
if username == 'ly' and password == '123':
func()
is_auth['is_login'] = True
else:
print('输入错误,不能调用函数')
return auth # 一定别忘记把内层函数的函数名返回出去
# auth(index)
# auth(home)
index = login_auth(index) # res => auth
index() # auth()
home = login_auth(home)
home()
login = login_auth(login)
login()
装饰器的固定模板
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()
装饰器双层语法糖
# 判断七句print执行顺序
def outter1(func1):
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2):
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3):
print('加载了outter3')
def wrapper3(*args, **kwargs):
print('执行了wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
@outter1
@outter2
@outter3
def index():
print('from index')
有参装饰器
# 认证装饰器
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()