装饰器

开放封闭原则: 对修改封闭对扩展开放
装饰器,本身可以是任意可调用的对象,被装饰者也可以是任意可调用对象
原则:1不能修改被装饰对象的源代码,2不能修改被装饰对象的调用方式
目标:在遵循1和2的前提下为被装饰的对象添加上新的功能

装饰器的用法:
1#无参数的装饰器

import time
def wrapper(func):
    def inner(*args,**kwargs):
        start_time =time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("run time is %s" %(stop_time-strat_time))
        return res
    return wrapper

        

2#有参数的装饰器

def wrapper(flag):
    if flag:
        def inner(func):
       
                    def inner1(*args,**kwargs):
                        #new method
                        res = func(*args,**kwargs)
                    return inner1
                return inner
    else:
        return func

3#装饰器语法
被装饰函数的正上方,单独一行
@deco1
@deco2
@deco3
def foo():
pass
等价于 foo=deco1(deco2(deco3(foo)))

装饰器的补充:wraps

from functools import wraps
def deco(func):
    @wraps(func) #加在最内层函数的正上方
    def wrapper(*args,**kwrags):
        return func(*args,**kwargs)
    return wrapper
@deco
def index():
    print("from index")
print(index.__doc__)

**使用wraps装饰器“装饰”过wrapper后,wrapper的__doc__、__name__等属性和deco要“装饰”的函数index的这些属性完全一样。**

posted on 2019-03-18 20:22  bigcatbc  阅读(67)  评论(0编辑  收藏  举报

导航