python装饰器--原来如此简单,python装饰器菜鸟教程_2

  python装饰器--原来如此简单,python装饰器菜鸟教程

  Decorator是我们项目写作中最容易出现的内容。牢固掌握这一部分,对于我们的代码能否写得流畅非常重要。下面是关于python decorator最详细的介绍。

  装饰器的示例代码

  #定义装饰者

  defdecorator(func):

  定义者():

  #在内部函数中修饰现有函数。

  打印(“已添加登录验证”)

  函数()

  returninner

  defcomment():

  打印(“注释”)

  #调用装饰器来装饰已有的函数,左边的comment=inner。

  comment=decorator(注释)

  #调用方法不变。

  评论()装饰器的语法糖写法

  如果有多个函数需要添加登录验证的功能,每次都要写func=decorator(func)之类的代码来修饰已有的函数,比较麻烦。

  Python提供了一种更简单的编写装饰函数的方式,即语法糖。语法糖的写作格式是: @装饰者姓名。也可以通过语法糖来修饰现有的功能。

  #定义装饰者

  defdecorator(func):

  定义者():

  #在内部函数中修饰现有函数。

  打印(“已添加登录验证”)

  函数()

  returninner

  @装饰

  ator#comment=decorator(comment)装饰器语法糖对该代码进行了封装左边comment=inner

  defcomment():

  print('发表评论')

  

  

  #调用方式不变

  comment()

装饰器的执行时机

  

当前模块加载完成以后,装饰器会立即执行,对已有函数进行装饰。

  

#定义装饰器

  defdecorator(func):

  print('装饰器执行了')

  

  definner():

  #在内部函数里面对已有函数进行装饰

  print('已添加登录认证')

  func()

  

  returninner

  

  

  @decorator#comment=decorator(comment)装饰器语法糖对该代码进行了封装左边comment=inner

  defcomment():

  print('发表评论')

运行结果

  

装饰器执行了

  

1

装饰器实现已有函数执行时间的统计

  

importtime

  

  

  defdecorator(func):

  definner():

  #获取时间距离1970-1-10:0:1的时间差

  begin=time.time()

  func()

  end=time.time()

  result=end-begin

  print(f'函数执行完成耗时:{result}')

  

  returninner

  

  

  @decorator

  defwork():

  foriinrange(10000):

  print(i)

  

  

  work()

装饰带有参数的函数

  

defdecorator(func):

  definner(num1,num2):

  print('正在努力执行加法计算')

  func(num1,num2)

  

  returninner

  

  

  @decorator

  defadd_num(num1,num2):

  result=num1+num2

  print(f'结果为:{result}')

  

  

  add_num(1,2)

装饰带有参数、返回值的函数

  

defdecorator(func):

  definner(num1,num2):

  print('正在努力执行加法计算')

  num=func(num1,num2)

  returnnum

  

  returninner

  

  

  @decorator

  defadd_num(num1,num2):

  result=num1+num2

  returnresult

  

  

  result=add_num(1,2)

  print(f'结果为:{result}')

类装饰器的使用

  

classMyDecorator(object):

  def__init__(self,func):

  self.__func=func

  

  #实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用

  def__call__(self,*args,**kwargs):

  #对已有函数进行封装

  print('马上就有下班啦')

  self.__func()

  

  

  @MyDecorator#@MyDecorator=>show=MyDecorator(show)

  defshow():

  print('快要下雪啦')

  

  

  #执行show,就相当于执行MyDecorator类创建的实例对象,show()=>对象()

  show()

扩展:

  

函数之所以能够调用,是因为函数内部实现了 __call__ 方法

  

以上就是关于装饰器的全部内容了,如需了解更多python实用知识,点击进入PyThon学习网教学中心

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: