带括号如下代码
func_dic = {} def make(name): def demo(func): func_dic[name] = func return demo @make("1") #这里就相当与@demodef 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)),正如我上面理解的一样,这里我就不累赘了。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281399.html