加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Python @函数装饰器及用法 超级细说

发布时间:2022-07-07 07:29:14 所属栏目:语言 来源:互联网
导读:前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数
  前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。
 
  那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示:
  #funA 作为装饰器函数
  def funA(fn):
      #...
      fn() # 执行传入的fn参数
      #...
      return '...'
  @funA
  def funB():
      #...
 
  实际上,上面程序完全等价于下面的程序:
  def funA(fn):
      #...
      fn() # 执行传入的fn参数
      #...
      return '...'
  def funB():
      #...
  funB = funA(funB)
  通过比对以上 2 段程序不难发现,使用函数装饰器 A() 去装饰另一个函数 B(),其底层执行了如下 2 步操作:
  将 B 作为参数传给 A() 函数;
  将 A() 函数执行完成的返回值反馈回  B。
 
  举个实例:
  #funA 作为装饰器函数
  def funA(fn):
      print("C语言中文网")
      fn() # 执行传入的fn参数
      print("http://c.biancheng.net")
      return "装饰器函数的返回值"
  @funA
  def funB():
      print("学习 Python")
  程序执行流程为:
  C语言中文网
  学习 Python
  http://c.biancheng.net
 
  在此基础上,如果在程序末尾添加如下语句:
  print(funB)
  其输出结果为:
  装饰器函数的返回值
 
  显然,被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值),即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,那么被修饰的函数名依然表示一个函数。
  实际上,所谓函数装饰器,就是通过装饰器函数,在不修改原函数的前提下,来对函数的功能进行合理的扩充。
 
  带参数的函数装饰器
  在分析 funA() 函数装饰器和 funB() 函数的关系时,细心的读者可能会发现一个问题,即当 funB() 函数无参数时,可以直接将 funB 作为 funA() 的参数传入。但是,如果被修饰的函数本身带有参数,那应该如何传值呢?
 
  显然,通过 funB() 函数被装饰器 funA() 修饰,funB 就被赋值为 say。这意味着,虽然我们在程序显式调用的是 funB() 函数,但其实执行的是装饰器嵌套的 say() 函数。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!