Python如何在函数上添加包装器

  介绍

这篇文章主要讲解了Python如何在函数上添加包装器,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

<强>问题

你想在函数上添加一个包装器,增加额外的操作处理(比如日志,计时等)。

<强>解决方案

如果你想使用额外的代码包装一个函数,可以定义一个装饰器函数,例如:

进口时间
  从functools进口包装
  
  def timethis(函数):
  & # 39;& # 39;& # 39;
  装饰,报告的执行时间。
  & # 39;& # 39;& # 39;
  @wraps(函数)
  def包装器(* args, * * kwargs):
  开始=time.time ()
  结果=func (* args, * * kwargs)
  结束=time.time ()
  打印(函数。__name__ end-start)
  返回结果
  返回包装

下面是使用装饰器的例子:

在祝辞祝辞@timethis   …def倒计时(n):   …& # 39;& # 39;& # 39;   …数量下降   …& # 39;& # 39;& # 39;   …n比;0:   …n -=1   …   在在在倒计时(100000)   倒计时0.008917808532714844   在在在倒计时(10000000)   倒计时0.87188299392912   祝辞祝辞祝辞

<>强讨论

一个装饰器就是一个函数,它接受一个函数作为参数并返回一个新的函数。当你像下面这样写:

@timethis   def倒计时(n):   通过

跟像下面这样写其实效果是一样的:

 def倒计时(n):
  通过
  倒计时=timethis(倒计时)

顺便说一下,内置的装饰器比如@staticmethod, @classmethod, @ property原理也是一样的,例如,下面这两个代码片段是等价的:

 A类:
  @classmethod
  def方法(cls):
  通过
  
  乙级:
  #等价类方法的定义
  def方法(cls):
  通过
  classmethod(方法)方法=

在上面的包装器()函数中,装饰器内部定义了一个使用* args和* * kwargs来接受任意参数的函数。在这个函数里面调用了原始函数并将其结果返回,不过你还可以添加其他额外的代码(比如计时),然后这个新的函数包装器被作为结果返回来代替原始函数。

需要强调的是装饰器并不会修改原始函数的参数签名以及返回值。使用* args和* * kwargs目的就是确保任何参数都能适用。而返回结果值基本都是调用原始函数func (* args, * * kwargs)的返回结果,其中函数就是原始函数。

刚开始学习装饰器的时候,会使用一些简单的例子来说明,比如上面演示的这个。不过实际场景使用时,还是有一些细节问题要注意的。比如上面使用@wraps(函数)注解是很重要的,它能保留原始函数的元数据(下一小节会讲到),新手经常会忽略这个细节。接下来的几个小节我们会更加深入的讲解装饰器函数的细节问题,如果你想构造你自己的装饰器函数,需要认真看一下。

看完上述内容,是不是对Python如何在函数上添加包装器有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

Python如何在函数上添加包装器