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


带括号如下代码

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

(0)
上一篇 2022年8月21日
下一篇 2022年8月21日

相关推荐

发表回复

登录后才能评论