zoukankan      html  css  js  c++  java
  • python装饰器

    (1)装饰器

    装饰器的本质就是函数,功能是为其它函数添加附加功能

    装饰器的原则是:不修改被修改函数的源代码和调用方式

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

    装饰器的框架为:

     def timmer(func):
         def wrapper():
             print(func)   #func相当于作用域
             func()
         return wrapper

    要求为以下代码加一个装饰器,计算睡眠时间

    def test():
        time.sleep(3)
        print('test函数运行完毕')
      return test test()

    将装饰器的框架引入:

    import time
    def timmer(func):             #func=test
        def wrapper():
            start_time = time.time()
            res=func()            #就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' % (stop_time - start_time))
         return res
    return wrapper def test(): time.sleep(3) print('test函数运行完毕')
      return '这就是test的返回值' test
    =timmer(test) #返回的是wrapper的地址 res=test() #执行的是wrapper()
    print(res)

    运行结果为:

    test函数运行完毕
    运行时间是3.0003621578216553
    这是test的返回值

    此时虽然没有改变原函数的调用方式,但要在test()之前执行test=timmer(test)这一个赋值操作,相当于改变了源代码,故需要进行优化

    import time
    def timmer(func):
        def wrapper():
            start_time = time.time()
            res=func()
            stop_time = time.time()
            print('运行时间是%s' % (stop_time - start_time))
            return res
        return wrapper
    @timmer
    def test():
        time.sleep(3)
        print('test函数运行完毕')
        return '这是test的返回值'
    res=test()               #执行的是wrapper()
    print(res)

    给函数加上参数(# *args:用来将参数打包成tuple给函数体调用;# **kwargs:打包关键字参数成dict给函数体调用)

    import time
    def timmer(func): #func=test1
        def wrapper(*args,**kwargs): #test('王强',age=18)  args=('王强')  kwargs={'age':18}
            start_time=time.time()
            res=func(*args,**kwargs) #就是在运行test()         func(*('王强'),**{'age':18})
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
            return res
        return wrapper
    @timmer
    def test(name,age):
        time.sleep(3)
        print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
        return '这是test的返回值'
    res=test('王强',age=18)  #就是在运行wrapper
    print(res)

    运行结果为:

    test函数运行完毕,名字是【王强】 年龄是【18】
    运行时间是3.000087261199951
    这是test的返回值

    user_list=[
        {'name':'王强','passwd':'123'},
        {'name':'linhaifeng','passwd':'123'},
        {'name':'wupeiqi','passwd':'123'},
        {'name':'yuanhao','passwd':'123'},
    ]
    current_dic={'username':None,'login':False}
    
    def auth_func(func):
        def wrapper(*args,**kwargs):
            if current_dic['username'] and current_dic['login']:
                res = func(*args, **kwargs)
                return res
            username=input('用户名:').strip()
            passwd=input('密码:').strip()
            for user_dic in user_list:
                if username == user_dic['name'] and passwd == user_dic['passwd']:
                    current_dic['username']=username
                    current_dic['login']=True
                    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('王强')
    shopping_car('王强')
  • 相关阅读:
    apache安装错误error: APR not found解决办法
    (总结)Nginx配置文件nginx.conf中文详解
    多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
    x-forwarded-for的深度挖掘
    hashcode与字符串
    千万不要误用 java 中的 HashCode 方法
    浅谈Java中的hashcode方法
    MySQL中concat函数
    mysql prepare语句使用
    修改表结构
  • 原文地址:https://www.cnblogs.com/quyao/p/9664820.html
Copyright © 2011-2022 走看看