• 11:装饰器


    装饰器的形成:

      加入要计算执行代码的时间,执行下面程序:

    import time
    def timemer():
        def inner():
            start=time.time()
            time.sleep(0.01)
            print('老师同学新年好!')
            end=time.time()
            print(end-start)
        return inner

    其中:

    time.sleep(0.01)
            print('老师同学新年好!')

    这句代码可以用新的函数代替:

    def func():
        time.sleep(0.01)
        print('老师同学新年好!')

    那么,当func=timmer(func)时,timmer变成这样:

    def timemer(f):                                   #装饰器函数
        def inner():
            start=time.time()
            f()
            end=time.time()
            print(start-end)
        return inner

    此时func就是被装饰的函数

    装饰器的作用:

    不想修改函数的调用方式,但是还想在原来的函数前后添加功能,timmer就是一个装饰器函数,只是对一个函数有一些装饰作用。

    原则:开放封闭原则

    开放:对扩展是开放的

    封闭:对修改是封闭的

    装饰器:装饰带参数的函数

    装饰带参数函数的装饰器
    def timmer(f):    #装饰器函数
        def inner(*args,**kwargs):
            #(1,2) /(1)
            start = time.time()
            ret = f(*args,**kwargs)  #f(1,2)       #被装饰的函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @timmer         #语法糖 @装饰器函数名
    def func(a,b):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a,b)
        return '新年好'
    
    @timmer         #语法糖 @装饰器函数名
    def func1(a):     #被装饰的函数
        time.sleep(0.01)
        print('老板好同事好大家好',a)
        return '新年好'
    func = timmer(func)
    ret = func(1,2)   #inner()
    ret = func(1,b = 2)   #inner()
    print(ret)
     def wrapper(f):    #装饰器函数,f是被装饰的函数
         def inner(*args,**kwargs):
             '''在被装饰函数之前要做的事'''
             ret = f(*args,**kwargs)    #被装饰的函数
             '''在被装饰函数之后要做的事'''
             return ret
         return inner
    
     @wrapper         #语法糖 @装饰器函数名
     def func(a,b):     #被装饰的函数
         time.sleep(0.01)
         print('老板好同事好大家好',a,b)
         return '新年好
  • 相关阅读:
    使用slf4j取代Apache Commons Logging
    IntelliJ远程调试教程
    java日志,(commons-loging 、log4j 、slf4j 、LogBack介绍)
    oracle 时间函数
    在Windows操作系统中,如何终止占有的8080端口的tomcat进程
    解决dwr报错【 Error: java.lang.SecurityException: No class by name: service】
    eclipse下使用tomcat启动maven项目
    Eclipse Java注释模板设置详解
    weblogic启动时日志重定向(nohup.out)
    信息化的基本概念
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8136874.html
Copyright © 2020-2023  润新知