zoukankan      html  css  js  c++  java
  • 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 '新年好
  • 相关阅读:
    linux常用命令三
    linux常用命令二
    redis持久化
    Linux环境redis集群搭建
    Maven常用命令
    Maven生成项目站点
    maven中import scope依赖方式解决单继承问题的理解
    maven使用assembly打包tar.gz文件
    Apache CXFjar包目录(转)
    WebService学习笔记一
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8136874.html
Copyright © 2011-2022 走看看