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')