# 装饰器
# 本质就是函数,为其它函数添加附加功能
# 原则:1,不修改被修饰函数的源代码;2,不修改被修饰函数的调用方式
# 装饰器=高阶函数+函数嵌套(在函数体内又定义函数)+闭包
# 装饰器的简单框架
def timer(func):
def wrapper():
# 加上需要的代码
func()
# 加上需要的代码
return wrapper
@timer # @timer相当于test = timer(test)
def test():
print('test函数执行完毕')
# test = timer(test) 这里返回的是wrapper的内存地址
# test() 这里执行的是wrapper
test() # 运行test函数后,timer装饰器起作用
# 装饰器加上返回值
def timer(func):
def wrapper():
# 加上需要的代码
res = func()
# 加上需要的代码
return res
return wrapper
# 装饰器加上参数
def timer(func):
def wrapper(*args, **kwargs):
# 加上需要的代码
res = func(*args, **kwargs)
# 加上需要的代码
return res
return wrapper
# 案例 在所有函数中加入验证登陆功能
user_list = [
{"name": "Alex", "pwd": "123"},
{"name": "Joe", "pwd": "1234"},
{"name": "Mark", "pwd": "12345"},
{"name": "Flank", "pwd": "123456"}
]
user_dic = {"username": None, 'login': False}
def logincheck(func):
def wrapper(*args, **kwargs):
if user_dic["username"] and user_dic["login"]:
res = func(*args, **kwargs)
return res
username = input('请输入用户名').strip()
password = input('请输入密码').strip()
for user in user_list:
if username == user["name"] and password == user["pwd"]:
user_dic["username"] = username
user_dic['login'] = True
res = func(*args, **kwargs)
return res
print('用户名或密码错误')
return wrapper
@logincheck
def index():
print('这里是主页')
@logincheck
def home(name):
print('%s,欢迎回家' % name)
@logincheck
def shopping(name):
print('%s,您的购物列表中有xxx' % name)
index()
home('张三')
shopping('张三')
# 装饰器加参数,上面案例再确定数据库类型,比如index是文件,home是mysql
user_list = [
{"name": "Alex", "pwd": "123"},
{"name": "Joe", "pwd": "1234"},
{"name": "Mark", "pwd": "12345"},
{"name": "Flank", "pwd": "123456"}
]
user_dic = {"username": None, 'login': False}
def logincheck_auth(auth_type):
def logincheck(func):
def wrapper(*args, **kwargs):
print('认证类型', auth_type)
if auth_type == 'filedb':
if user_dic["username"] and user_dic["login"]:
res = func(*args, **kwargs)
return res
username = input('请输入用户名').strip()
password = input('请输入密码').strip()
for user in user_list:
if username == user["name"] and password == user["pwd"]:
user_dic["username"] = username
user_dic['login'] = True
res = func(*args, **kwargs)
return res
elif auth_type == 'mysql':
print('这里是mysql进行操作的代码')
else:
print('这里是其它认证方式的代码')
print('用户名或密码错误')
return wrapper
return logincheck
@logincheck_auth(auth_type='filedb')
def index():
print('这里是主页')
@logincheck_auth(auth_type='mysql')
def home(name):
print('%s,欢迎回家' % name)
@logincheck_auth(auth_type='other')
def shopping(name):
print('%s,您的购物列表中有xxx' % name)
index()
home('张三')
shopping('张三')