首页 > 编程语言 >python使用装饰器时带括号与不带括号的区别 | 装饰

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

时间:2022-08-21 17:33:15浏览次数:89  
标签:func1 python demo 括号 func 装饰 make1

带括号如下代码

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)),正如我上面理解的一样,这里我就不累赘了。

标签:func1,python,demo,括号,func,装饰,make1
From: https://www.cnblogs.com/jira/p/16610394.html

相关文章

  • python3 使用paho-mqtt
    python版本:python3.8mqtt库:paho-mqtt1.6.1 一,消息发布创建pub.py,写入以下代码importtimefrompaho.mqttimportclientasmqtt_client#broker服务器broker......
  • python-f字符串(f-string)99乘法表三种方式
    #%s打印99乘法表foriinrange(1,10):forjinrange(1,i+1):print("%s*%s=%s"%(j,i,j*i),end="")print("\n")#format打印九九乘法表foriinrange(1,......
  • Python教程 - 画折线图
    matplotlibmatplotlib是Python的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。matplotlib可以用来绘制各种静态,动态,交互式的图表。matplotlib......
  • Python教程 - 保存分数结果至文件
    保存文件的方法fns='test_out.txt'withopen(fns,'w+')asfs:print('helloworldbypython',file=fs)将上节课的分析的分数结果保存至文件importtkinter......
  • python 使用正则表达式截取字符串
    假设字符串“a={};”要截取包含花括号在内的内容importrepattern=r="=(.+?);"match_bet_list=eval(re.findall(pattern,match_bet_list,re.M)[0])re.M表示在字符......
  • python-%格式化输出
    输出输出使用的是print()函数,作用,将程序中的数据或结果打印到控制台(屏幕)print('helloworld')name='小明'print(name)age=18print(name,age)#可以使用逗号输出......
  • Python 处理html、url字符串编码和解码(base64,escape,urlencode)
    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。对html进行编码Python2.x中可以使用cgi中escape,Pyth......
  • 基于python的数学建模---logicstic回归
    樱花数据集的Logistic回归   绘制散点图importmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.datasetsimportload_irisiris=load_iris()#获......
  • Mac安装python jupyter notebook
    前置条件:已安装python3查看当前python版本:python--version如果不使用虚拟环境,直接用步骤3和步骤4即可。1.创建虚拟环境:pip3installvirtualenvpython3-mvirtuale......
  • python switch 替换if else
    1,python解释器版本3.10以上可以使用如下defdar(darling):matchdarling:case'400':print(400)case'401':print(4......