ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

@函数装饰器

2022-04-07 15:02:36  阅读:204  来源: 互联网

标签:函数 funcB funcA input 装饰 def


装饰器

  • 假设用funcA函数装饰器去装饰funcB函数
# 装饰器函数
def funcA(fc):
  print('this is funcA')
  # 执行传入的fc参数
  fc()
  return fc

@funcA
def funcB():
  print('this is funcB')
funcB()

output:
this is funcA
this is funcB
this is funcB

以上内容等价于:

# 装饰器函数
def funcA(fc):
  print('this is funcA')
  # 执行传入的fc参数
  fc()
  return fc

def funcB():
  print('this is funcB')
funcB = funcA(funcB)

即:funcB作为参数传给装饰器函数funcAfuncA的执行返回值赋值给funcB

由此可见,被“装饰”的函数取决于装饰器的返回值

实际上,所谓函数装饰器,就是通过装饰器函数,在不改变原函数的前提下,对函数的功能进行合理扩充。

带参的装饰器

  • funcB没有参数时,直接将funcB作为参数传给装饰器funcA
  • funcB有参数时,可在装饰器funcA中嵌套一个函数,该函数的参数个数与funcB相同。
  • Example:
def funcA(fc):
  def subFunc(input):
    print('funcA-subFunc:{}'.format(input))
  return subFunc

@funcA
def funcB(input):
  print('funcB:{}'.format(input))
funcB('函数装饰器')

output:
funcA-subFunc:函数装饰器

显然,在程序中调用的是funcB函数,但实际执行的是被装饰器嵌套的subFunc函数。
以上代码等价于:

def funcA(fc):
  def subFunc(input):
    print('funcA-subFunc:{}'.format(input))
  return subFunc

def funcB(input):
  print('funcB:{}'.format(input))
func = funcA(funcB)
func('函数装饰器')

output:
funcA-subFunc:函数装饰器

以上示例为函数只有一个参数的情况,若一个装饰器用于多个函数,该如何定义呢?

*args**kwargs 表示可以接受任意数量与类型的参数,可将其作为装饰器嵌套函数的参数。例如:

def funcA(fc):
  def subFunc(*args, **kwargs):
    print('funcA:{}'.format(*args, **kwargs))
  return subFunc
@funcA
def funcB(input):
  print('funcB:{}'.format(input))

@funcA
def funcC(input):
  print('funcC:{}'.format(input))
# 字符串
funcB('funcB')
# 整数
funcC(1)

outputs:
funcA:funcB
funcA:1

标签:函数,funcB,funcA,input,装饰,def
来源: https://www.cnblogs.com/ArdenWang/p/16112322.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有