函数装饰器

装饰器

一、装饰器的形成过程

最简单的装饰器------->有返回值--------->有一个参数---------->万能参数

最简单的装饰器

import time
def func():
    time.sleep(1)
    print("大家好")
def timmer(f):        #装饰器函数
    def inner():
        start=time.time()
        f()              #被装饰的函数
        end=time.time()
        print(end-start)
    return inner
func=timmer(func)     #相当于inner()
func

有返回值

import time
def timmer(f):    #装饰器函数
    def inner():
        start = time.time()
        ret = f()       #被装饰的函数
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #语法糖 @装饰器函数名
def func():     #被装饰的函数
    time.sleep(0.01)
    print('老板好同事好大家好')
    return '新年好'
# func = timmer(func)
ret = func()   #inner()
print(ret)

装饰带参数函数的装饰器

import time
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 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)

 

二、装饰器的作用

1、不想修改函数的调用方式,但是还想在原来的函数前后添加功能。

2、timmer就是一个装饰器函数,但是对一个函数有一些装饰作用。

三、原则:开放封闭原则

开放:对扩展是开放的

封闭:对修改是封闭的

四、装饰器的固定模式

def wrapper(func):   #qqxing
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)   #被装饰的函数
        return ret
    return inner

@wrapper        #qqxing = wrapper(qqxing)
def qqxing():
    print(123)

ret = qqxing()   #inner

 

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

def wrapper():
    def inner():
        pass
    return inner
固定模式

 五、wraps

from functools import wraps      #导入wraps装饰器
def wrapper(func):  #func = holiday
    @wraps(func)
    def inner(*args,**kwargs):
        print('在被装饰的函数执行之前做的事')
        ret = func(*args,**kwargs)
        print('在被装饰的函数执行之后做的事')
        return ret
    return inner

@wrapper   #holiday = wrapper(holiday)
def holiday(day):
    '''这是一个放假通知'''
    print('全体放假%s天'%day)
    return '好开心'

print(holiday.__name__)    #查看字符串格式的函数名
print(holiday.__doc__)     #document
ret = holiday(3)   #inner
print(ret)

六、带参数的装饰器

import time
FLAGE = False                #定义全局变量
def timmer_out(flag):
    def timmer(func):
        def inner(*args,**kwargs):
            if flag:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end-start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timmer
# timmer = timmer_out(FLAGE)
@timmer_out(FLAGE)    #wahaha = timmer(wahaha)
def wahaha():
    time.sleep(0.1)
    print('wahahahahahaha')

@timmer_out(FLAGE)
def erguotou():
    time.sleep(0.1)
    print('erguotoutoutou')

wahaha()
erguotou()

七、多个装饰器装饰一个函数

注意:哪个装饰器离函数近,先执行哪个装饰器

posted @ 2018-02-08 18:37  高~雅  阅读(162)  评论(0编辑  收藏  举报