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 '新年好

 

posted @ 2018-01-08 08:38  王二黑  阅读(93)  评论(0编辑  收藏  举报