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')
  • 相关阅读:
    Ubuntu安装adobe的Source Code Pro
    Oracle实现主键自增的几种方式
    Oracle主键自增
    activity 根据流程实例ID删除流程实例、删除流程部署
    解决报错:错误1130- Host xxx is not allowed to connect to this MariaDb server
    Idea-每次修改JS文件都需要重启Idea才能生效解决方法
    html中<a href> </a>的用法
    Mysql8_数据库基础操作
    java反射及Method的Invoke方法(转载)
    oracle查询数据插入时间
  • 原文地址:https://www.cnblogs.com/littlepage/p/9398040.html
Copyright © 2011-2022 走看看