python中的装饰器

北战南征 提交于 2019-12-01 16:51:36
什么是装饰器:可以理解为添加新的功能。定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。装饰器形成的过程     *args   接收:聚合  调用:打散import timeprint(time.time())time.sleep(3)#让程序执行到此位置的时候停留print('vhdihfiufhui')def timer(f):#计算函数的执行时间    start = time.time()    f()    end=time.time()    print(end-start)def func():    time.sleep(1)    print('hahahhah')timer(func)装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质是:闭包原则:开放封闭原则

1.对扩展是开放的

2.对修改是封闭的

   

装饰器的固定模式def func():    time.sleep(2)    print('哈哈哈哈哈')def timmer(func):      #闭包   ----》指向func的内存地址  timmer就是一个装饰器函数    def inner():        start=time.time()        func()   #被装饰的函数        end=time.time()        print(end-start)    return innerfunc=timmer(func)  #先执行后面的function就是第一个函数func()  #实际执行innnertimmer就是一个装饰器函数,只是对一个函数,有一些装饰作用不想修改函数的调用方式,但是还想在原来的函数前后添加功能,so 使用装饰器语法糖:使代码更便捷@timmer(装饰器函数的名字) 写在被装饰的函数的上面 这个就相当于:func=timmer(func)练习:def wrapper(func):#  传入func:被装饰的函数 *****    def inner(*args,**kwargs):        print('在被装饰的函数之前做的事')        ret=func(args,**kwargs)  #func被装饰的函数   参数是inner传给他的        print('在被装饰的函数执行之后做的事')        return ret    return inner@wrapper #holiday=wrapper(holiday)def holiday(day):    print('放假%s'%day)    return '哈哈哈哈哈'ret=holiday(3) #调用holidayprint(ret)#装饰器的固定格式一:def timmer(func):    def inner(*args,**kwargs):        '''执行函数之前要做的'''        re=func(*args,**kwargs)        '''执行函数之后要做的'''        return re    return inner 装饰器的固定格式二---wrappet版from functools import wrapsdef deco(func):    @wraps(func)#加在最内侧函数最上方    def wrapper(*args,**kwargs):        return func(*args,**kwargs)    return wrapper装饰器的进阶    functools.wraps    带参数的装饰器    多个装饰器装饰同一个函数def haha():    print('hahah')'''一个打印哈哈的函数'''print(haha.__name__)#查看函数(字符串)名print(haha.__doc__)#查看文本的函数加入:from functools import wraps@wraps(func)能查看函数的名字和文本 而不是装饰器的信息
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!