装饰器框架,实现一个装饰器,函数闭包加上参数,解压序列,函数闭包为函数加上认证功能,装饰器闭包模拟session

import time

'''装饰器框架实现'''
# def timmer(func):
# def wrapper():
# res = func(*args, **kwargs)
# return res
# return wrapper

'''实现一个装饰器'''
# def timmer(func): # func = test
# def wrapper(*args, **kwargs):
# start_time = time.time()
# res = func(*args, **kwargs) # 就是在运行test()
# stop_time = time.time()
# print('函数运行时间%s' % (stop_time - start_time))
# return res # 函数闭包加上返回值(返回被装饰函数所运行的结果)
# return wrapper

# @语法糖:@timmer就相当于test = timmer(test)
# @timmer
# def test():
# time.sleep(2)
# return '这是被装饰的函数'

# res = timmer(test) # 这里获取的是wrapper()函数的地址
# res() # 执行wrapper()函数,没有更改被修饰函数的源代码,但是修改了被修饰函数的调用方式

# test = timmer(test)
# test() # 这里已经遵循了装饰器的原则,没有修改被修饰函数源代码及调用方式

# print(test())


'''函数闭包加上参数'''
# def timmer(func):
# def wrapper(*args, **kwargs): # 这里加入的万能传参,目的是为了不修改被修饰函数的调用方式(当被修饰函数需要传参时)-----*args=('alex'),**kwars={'age':18}
# start_time = time.time()
# res = func(*args, **kwargs) # 就是在运行test()-----func(*('alex'), **{'alge':18})
# stop_time = time.time()
# print('函数运行时间是%s' % (stop_time - start_time))
# return res
# return wrapper
#
# def test(name, age): # 加上参数
# time.sleep(2)
# return name, age
#
# test = timmer(test) # 此时变量test获取的的是wrapper()函数的内存地址
# test('alex', age=18) # 这里运行的是wrapper()函数;不修改被修饰函数调用的方式,那么这里应该也是要传两个参数,所以wrapper()函数也需要进行传参,使用万能参数的话,就可以无条件适应被修饰函数的任何传参


'''解压序列'''
# l = [1, 2, 3, 4, 5, 'a', 'b']
# a,b,c,d,e,f,g = l
# print(a,b,c,d,e,f,g)
# aa, *dd, cc = l # 取第一个值和最后一个值,并赋值给aa和cc;中间的*dd代表除第一个值和最后一个值所剩下的值并赋值给dd
# print(aa, cc, dd)
#
# q = 1
# w = 2
# q,w = w,q
# print(q,w)


'''函数闭包为函数加上认证功能'''
# def auth_func(func):
# def wrapper(*args, **kwargs):
# username = input('请输入用户名:').strip()
# passwd = input('请输入密码:').strip()
# if username == 'alex' and passwd == '123':
# res = func(*args, **kwargs)
# return res
# else:
# print('用户名或密码错误')
# return wrapper
# @auth_func
# def index():
# print('欢迎来到京东主页')
# @auth_func
# def home(name):
# print('%s欢迎回到个人主页' % name)
# @auth_func
# def shopping_car(name):
# print('%s的购物车里有%s%s%s' % (name, '奶茶', '篮球', '篮球鞋'))
#
# index()
# home('lhf')
# shopping_car('lhf')


'''装饰器闭包模拟session'''
user_list = [
{'name':'aelx', 'passwd':'123'},
{'name':'lhf', 'passwd':'123'},
{'name':'yuanhao', 'passwd':'123'},
{'name':'wupeiqi', 'passwd':'123'},
]
user_dic = {'username':None, 'login':False} # 先定义一个字典,用作全局变量
def auth_func(func):
def wrapper(*args, **kwargs):
if user_dic['username'] and user_dic['login']: # 判断字典里的值是否为真,为真则已登录,为假则未登录
res = func(*args, **kwargs)
return res
username = input('请输入用户名:').strip()
passwd = input('请输入密码:').strip()
for i in user_list:
if username == i['name'] and passwd == i['passwd']:
user_dic['username'] = username # 第一次登录时,所输入的用户名及密码正确的话,更改全局变量字典user_dic里的value值,下次运行则不需要再输入用户名及密码了
user_dic['login'] = True
res = func(*args, **kwargs)
return res
else: # 此else不能放在if同级,因为for循环会遍历用户列表,那么当所取用户名及密码和输入不等时,那么就会运行一次else;因为if有return来结束函数,所以else放在for循环同级说明return没有执行,完全合理
print('用户名或密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到京东主页')
@auth_func
def home(name):
print('%s欢迎回到个人主页' % name)
@auth_func
def shopping_car(name):
print('%s的购物车里有%s%s%s' % (name, '奶茶', '篮球', '篮球鞋'))

index()
home('wupeiqi')
shopping_car('lhf')
上一篇:Java 基于MyBatis-Plus使用反射和注解的方式来简化频繁的过滤条件


下一篇:My Batis-Plus学习笔记