装饰器函数(二)

装饰器进阶

1.带参数的装饰器
就是在原有装饰器的基础上引入一个新的参数

多套一层函数,多传一个参数决定是否执行添加的功能,只是利用闭包多传了一个参数

和装饰器的原理一样,这次是把外界要传的参数通过在原有装饰器函数的基础上再套一层函数来实现的

现在装饰器函数最外层的作用只是在这个嵌套函数结构的空间里引入了一个新的局部变量,且变量的值由外部传入

此时多了一层函数嵌套,由于每一个函数名加上括号就是一层调用,因此要把@和@后面分开成两部分看,每一个函数名加上括号就是一层调用,因此要把@和@后面分开成两部分看

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()

在inner前加装饰器@wraps(func)就不影响原函数名的使用,但是需要从functools模块引入这个函数

如果是一层装饰器函数,则在外面取运行的函数名不是应有的本名,得到的是装饰器内部的'inner

 

2.多个装饰器装饰同一个函数

上面一个
下面一个
先执行上面的前,再下前,再下后,再上后
套娃执行结构,上面的在最外一圈。
原理:真实的执行顺序是必须先最近的装饰器函数,最近的装饰器函数把函数名传进来,返回值作为远的装饰器的参数进行执行.

执行效果如下图

可以记录用户的登陆情况,又计算执行时间,但是必须两件事执行顺序的逻辑必须明确。

posted @ 2019-07-10 19:51  眼见高楼起  阅读(123)  评论(0编辑  收藏  举报