python装饰器使用
装饰器是从英文decorator翻译过来的,从字面上来看就是对某个东西进行修饰,增强被修饰物的功能,下面我们对装饰器做下简单介绍。
一、怎么编写装饰器
装饰器的实现很简单,本质是一个可调用对象,可以是函数、方法、对象等,它既可以装饰函数也可以装饰类和方法,为了简单说明问题,我们实现一个函数装饰器,如下代码:# 定义一个装饰器 def decorator(f): def wrap(*pos, **kwarg): print("enter function", f.__name__) ret = f(*pos, **kwarg) print("leave function", f.__name__) return ret; return wrap # 使用上面定义的装饰器 @decorator def sum(a, b): print("a + b =", a + b) # 输出: # enter function sum # a + b = 3 # leave function sum sum(1,2)
有了这个装饰器,我们就可以打印出什么时候开始和结束调用函数,对于排查函数的调用链非常方便。
二、带参数的装饰器
上面的例子无论什么时候调用sum都会输出信息,如果我们需要按需输出信息怎么实现呢,这时就要用到带参数的装饰器了,如下代码:def decorator(debug=0): def wrap1(f): def wrap2(*pos, **kwarg): if debug: print("enter function", f.__name__) ret = f(*pos, **kwarg) if debug: print("leave function", f.__name__) return ret; return wrap2; return wrap1 @decorator() def sum(a, b): print("a + b =", a + b) @decorator(debug=1) def multi(a, b): print("a * b =", a * b) # 输出: # a + b = 3 sum(1,2) # 输出: # enter function multi # a * b = 2 # leave function multi multi(1,2)
对sum使用装饰器时没有参数,这时debug为0,所以调用sum时不会输出函数调用相关信息。
对multi使用装饰器时有参数,这时debug为1,所以调用multi时会输出函数调用相关信息。
三、函数名字问题
当我们打印被装饰后的函数名字时,不知道大家有没发现输出的不是函数本身的名字,如下代码会输出‘wrap’而不是‘sum’:# 定义一个装饰器 def decorator(f): def wrap(*pos, **kwarg): return f(*pos, **kwarg) return wrap # 使用上面定义的装饰器 @decorator def sum(a, b): print("a + b =", a + b) # 输出: # wrap print(sum.__name__)
有时这种表现并不是我们想要的,我们希望被装饰后的函数名字还是函数本身,那要怎么实现呢?很简单,只需要引入functools.wraps即可,如下代码就会输出‘sum’了:from functools import wraps # 定义一个装饰器 def decorator(f): # 使装饰后的函数保留原有名字 @wraps(f) def wrap(*pos, **kwarg): return f(*pos, **kwarg) return wrap # 使用上面定义的装饰器 @decorator def sum(a, b): print("a + b =", a + b) # 输出: # sum print(sum.__name__)
看完后是不是觉得python装饰器很简单,只要了解它的本质,怎么写都行,有好多种玩法呢。
使用hydra对端口进行爆破2022年,网站的防护(sql,xss)的安全保护也已经上升了一个等级,但是由于管理员的安全意识薄弱,网站弱口令漏洞依然猖獗,不信可以看补天的漏洞提交记录,弱口令依然是漏洞中的佼佼
盘点CES2022有亮点的智能穿戴设备CES2022已经过去了,因为疫情的影响,现在的CES再也不是以前哪种轰轰烈烈的大场面,但我们仍然能看到一些有趣的穿戴设备发布,其中即有去年热门产品的升级款,也有全新产品的发布,我
计算机程序设计语言分为四类计算机程序设计语言分为四类为了让计算机解决实际问题,人们从一开始就不断地开展程序设计工作,这里的程序就是计算机能够执行的指令代码(机器码和其它代码)。程序设计人员还必须在一个被称为
欧研发收集海底垃圾的机器人系统近日,一个欧洲科研团队开发了一种可在水下收集垃圾的机器人系统,并成功进行了原型机的首次测试。该机器人系统由4个自主机器人组成,能通过深度学习算法和声学传感器将垃圾与海洋动植物区分开
2022年适用于全新MacBook的最佳macOS应用程序在世界上所有伟大的感情中,有一个人是最重要的。没错,我说的是买一台新的苹果电脑。除了它显然是一个闪亮的新事物之外,真正让我着迷的是从一张白纸开始的想法。在这个阶段,你的旧机器可能装
现在滴滴好干吗?过了年准备跑滴滴,大家给点意见?特别好干,单子特别多,早高峰能接三四单,过了早高峰短短一小时就能接到一单,特别好,很轻松,一天流水高达一两百越来越好跑了,尤其是没有双证的非法营运黑网约车更好跑,月入两三万不是梦!
空调一直开着和一开一关,哪个更省电?听听家电师傅怎么说空调一直开着和一开一关,哪个更省电?听听家电师傅怎么说编辑美家指南作为大家电之一,空调的使用周期虽然只在每年的冬夏季节,但是它集中使用频率很高。而且直接影响着我们的居住舒适感。所以
过年送长辈该买什么手机?大电池大屏幕大音量,长辈用了都说好过年了,在外漂泊的游子也要归家了。忙碌了一年,也是时候回家看看了。在外打拼,最放心不下的和最为你担忧的,只有家里的老人。这时候没有什么比见他们更重要的事情了,但我们漂泊在外难免不能
我眼中的OPPOFindX2Pro我的手机虽然一直换个不停,但是一直当二把手的FindX2Pro在这大半年以来就一直没换过。作为沈义人操刀的在OPPO顶级旗舰系列中的绝唱,X2P从一开始似乎就已经坐稳了叫好不叫座的
最疯狂的骁龙8Gen1旗舰来袭22GB内存640GB存储双风扇散热虽然高通发布骁龙8Gen1已经是去年底的事了,但目前市场上搭载该芯片的新机数量还不多,同时也面临了一个严重的问题,那就是配置同质化。大多数骁龙8Gen1新机相比去年的骁龙888手机
为什么高价低配的OPPO和vivo手机还有那么多人买?这都2022年了,如果还有人说OPPO和vivo高价低配,那我只能说生活的圈子太闭塞了,或者说看问题太片面了。首先任何品牌都有溢价,OV的溢价绝对不是最离谱的就说国内,主流的手机品