装饰器
# 装饰器 # 本质就是函数,为其它函数添加附加功能 # 原则: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('张三')