python如何实现函数装饰器

  

python如何实现函数装饰器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

装饰器本质上是一个python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于为已有函数/类添加记录日志,计时统计,性能测试等。

首先定义一个倒计时函数,这个函数的功能非常简单,就是把n从当前值减少到0。

 def倒计时(n):
  n比;0:
  打印(& # 39;时间# 39;+ str (n))
  n -=1
  
  打印(countdown.__name__) 

程序输出:

倒计时

<强> 1。为函数增加一个日志装饰器

假设现在要增强倒计时的功能,在函数调用前后自动打印日志,又不想修改函数自身的功能。这种在代码运行期间动态增加功能的方式,称之为装饰器(Decorator)。

能打印日志的装饰,可以定义如下:

 def日志(函数):
  def包装器(* args, * *千瓦):
  打印(& # 39;调用% s()强生# 39;% func.__name__)
  返回func (* args, * *千瓦)
  返回包装

然后我们借助Python的@语法,把装饰置于函数的定义处:

@log   def倒计时(n):   n比;0:   打印(& # 39;时间:& # 39;+ str (n))   n -=1      倒计时(10)

程序输出:

调用倒计时()。
时间:10
时间:9
时间:8
时间:7
时间:6
时间:5
时间:4
时间:3
时间:2
时间:1

但此时我们再打印函数的名称:

打印(countdown.__name__)

程序输出:

包装

我们发现函数的元数据信息变了,这显然不是我们想要的结果。

<强> 2。在装饰器中拷贝元数据

为了把函数的元数据信息都保留下来,我们可以直接使用Python提供的functools库中的@wraps装饰器。

进口时间
  从functools进口包装
  
  def时间成本(函数):
  @wraps(函数)
  def包装器(*参数,* * kwargs):
  开始=time.time ()
  结果=func (* args, * * kwargs)
  结束=time.time ()
  打印(函数。__name__,结束-开始)
  返回结果
  返回包装
  
  @TimeCost
  def倒计时(n):
  n比;0:
  打印(& # 39;时间:& # 39;+ str (n))
  n -=1
  
  倒计时(10000)

函数输出:

(& # 39;倒计时# 39;(0.0004801750183105469)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

python如何实现函数装饰器