python使用装饰器时带括号与不带括号的区别

带括号如下代码

func_dic = {}

def make(name):
    def demo(func):
        func_dic[name] = func
    return demo

@make("1") #这里就相当与@demo
def make1():
    return 1*10

这段代码的读取顺序,当碰到@make("1")时会先执行make("1")函数取出返回值,然后用返回值取装饰,这里其实相当于@demo,所以就会继续取读取demo函数里面的内容,相当于执行了 make1 = demo(make1) ,因为这个函数执行

  func_dic["1"] = make1 #把make1函数的地址赋值给了字典func_dic["1"]

  而且没有返回值,所以make1的值为None,如果要执行make1这个函数,需要如下这样执行

  func_dic["1"]()

这里给我的理解就是,如果装饰器加括号(相当于这个装饰器是函数里面的返回值,并不是装饰器的这个函数,就像上面的,看起来装饰器是make,其实真正的装饰器是demo),首先就是把装饰器解析为不带括号的,然后再去装饰其他函数,而装饰器就如下面的,实际上就是等于 sum = func1(sum) ----> demo

 

不带括号代码如下:

import time

def func1(func):
    def demo(*args,**kwargs):
        start = time.time()
        res =  func(*args,*kwargs)

        print("使用时长 %s" %(time.time()-start))
        return  res
    return demo

@func1 #sum = func1(sum)
def sum(x,y):
    return x**y

编译器在碰到@func1时,步骤跟有括号的第二步是一样的,加载func1函数(这里并不会执行),然后返回函数地址(sum = func1(sum)),正如我上面理解的一样,这里我就不累赘了。

 

posted @ 2019-09-19 11:15  Mr-谢  阅读(713)  评论(0编辑  收藏  举报