zoukankan      html  css  js  c++  java
  • Python day15装饰器基本理论,以及结合全局变量模拟session

      装饰器(decorator):为其他函数添加附加功能

    原则:1.不修改被修饰函数源代码

       2.不修改被修饰函数的调用方式

    装饰器=高阶函数+函数嵌套+闭包

    import time
    def timmer(func):
        def wapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print('函数运行时间是%s'%(stop_time-start_time))
            return res
        return wapper
    @timmer
    def cal(l):
        start_time=time.time()
        res=0
        for i in l:
            time.sleep(0.1)
            res+=i
        stop_time=time.time()
    
    cal(range(100))

    上述代码是一个装饰器案例,可能看不懂,下面分成三部分进行讲解

    1.高阶函数

      接收一个函数或者返回一个函数都称为高阶函数

    例如:

    def foo():
        print("你好")
    
    def test(func):
        print(func)
        func()
    
    test(foo)

    2.函数中嵌套定义另一个函数,叫函数嵌套

    3.嵌套函数各自封闭参数,叫做函数的闭包

    装饰器的基本框架

    def timmer(func):
        def wrapper():
            func()
        return wrapper
    
    # 传入函数,返回嵌套函数
    # 嵌套函数中传入原函数构成装饰器

    这样在不改变源代码的情况下,能够增加或者修改原函数,下面在函数的上方用@timmer进行调用即可

    将装饰器中传入*args可变参数和**kwargs可变关键字参数,即可做成万用的函数装饰器

    例子2   制作验证装饰器

    def auth_func(func):
        def wrapper(*args,**kwargs):
            func(*args,**kwargs)
            username=input('用户名:').rstrip()
            password=input('密码:').rstrip()
            if (username=='nnn' and password =='123'):
                res=func(*args,**kwargs)
                return res
            else:
                return print('密码错误')
        return wrapper
    
    @auth_func
    def index():
        print('欢迎来到京东')
    
    @auth_func
    def home(name):
        print('个人家园%s'%name)
    
    @auth_func
    def shoppingcart(name):
        print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜'))
    
    index()
    home("littlepage's home")
    shoppingcart('littlepage')

    上方代码是一个验证装饰器,在函数前加上@可调用装饰器

    再加上前面学习的全局变量,则可以模拟session

    usr_dictionary={'username':None,'login':False}
    
    def auth_func(func):
        def wrapper(*args,**kwargs):
            func(*args,**kwargs)
            username=input('用户名:').rstrip()
            password=input('密码:').rstrip()
            if usr_dictionary['username'] and usr_dictionary['login']:
                res=func(*args,**kwargs)
            if (username=='nnn' and password =='123'):
                res=func(*args,**kwargs)
                return res
            else:
                return print('密码错误')
        return wrapper
    
    @auth_func
    def index():
        print('欢迎来到京东')
    
    @auth_func
    def home(name):
        print('个人家园%s'%name)
    
    @auth_func
    def shoppingcart(name):
        print('%s的购物车有[%s,%s]'%(name,'衣服','蔬菜'))
    
    index()
    home("littlepage's home")
    shoppingcart('littlepage')
  • 相关阅读:
    2019 SDN上机第2次作业
    2019 SDN上机第1次作业
    第07组 团队Git现场编程实战
    第二次结对编程作业
    c语言之问题集
    2019春第2次课程设计实验安排
    2019年十二周总结
    第十一周总结
    第十周作业
    第九周总结
  • 原文地址:https://www.cnblogs.com/littlepage/p/9398040.html
Copyright © 2011-2022 走看看