page contents

一个模板帮你搞定装饰器

装饰器是闭包的升级版,闭包都学得够呛,装饰器怎么玩?照着这个模板,装饰器也可以轻松过关!

装饰器的定义:

装饰器本质上就是一个闭包函数(很重要,而闭包函数的外层函数的返回值是内层函数的函数名),它可以让被装饰的函数在不需要做任何代码变动的前提下增加额外功能。

装饰器符号“@”属于语法糖:

它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起(理解的时候,把它看成一个整体,执行顺序:从上往下)。在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数装饰器

装饰器的使用方法

  • 先定义一个装饰函数(帽子)(也可以用类、偏函数实现)

  • 再定义你的业务函数、或者类(人)(真正要执行的)

  • 最后把这顶帽子带在这个人头上;(把真正要执行函数的函数名作为装饰函数的参数传入)。

模板:

 标准装饰器写法:
 def wrapper(func):            # 参数func为真正要执行函数的函数名(业务函数名)
     def inner(*args,**kwargs):
         '''执行被装饰函数之前的操作'''
         ret = func(*args,**kwargs)    # 真正要执行的函数
         '''执行被装饰函数之后的操作'''
         return ret           # 这个按需选择是否有返回值
     return inner              # 闭包结构,返回内层函数的函数名
 # 这个就是标准的装饰器,完全符合代码开放封闭原则。这几行代码一定要背过,会用。

举例:

 import time
 #装饰函数
 def test(fn):
     def inner():
         print('这是inner')
         fn()  #fn()的函数的函数名作为了外层函数的参数
     return inner  #返回inner函数体的值,inner函数体无返回值,装饰器返回值是一个函数对象
 
 法一:
 def t1():
     print('哈哈哈')
 
 t = test(t1)  #装饰函数的fn在此处为t1
 t()           # 调用t() ( 即test(t1)() ),
               #即等价调用inner(),t()里面的参数对应inner()里面的参数。不理解就这么记着
 time.sleep(2)
 t()
 ——————————————————————————————————————
 法二:
 @test
 def t1():  #t1作为装饰函数的参数一直往内传
     print('哈哈哈')
 
 t1()
 time.sleep(2)
 t1()
 
 运行结果:
 这是inner
 哈哈哈
 这是inner
 哈哈哈

  • 发表于 2021-07-14 21:37
  • 阅读 ( 348 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Wilia
Wilia

28 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章