• 装饰器框架,实现一个装饰器,函数闭包加上参数,解压序列,函数闭包为函数加上认证功能,装饰器闭包模拟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')
    while True: print('studying...')
  • 相关阅读:
    phpstudy apache无法启动的解决办法
    Windows server 2008 快速搭建域环境
    使用netsh来进行端口转发
    基于docker构建测试环境
    [Leetcode] Linked List Cycle
    Hyper-V下安装Ossim系统
    Windows应用替代方案接龙
    图解CISCO 3550忘记密码解决方法
    硬件代理解决用户上网问题
    图->存储结构->数组表示法(邻接矩阵)
  • 原文地址:https://www.cnblogs.com/xuewei95/p/14478783.html
Copyright © 2020-2023  润新知