• @函数装饰器


    装饰器

    • 假设用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
    
  • 相关阅读:
    Windows Server 2008 R2 实现多用户连接远程桌面
    增加远程登录用户登陆个数
    Win2008R2PHP5.4环境加载Zend模块
    Windows 和  Linux 下 禁止ping的方法
    Windows 2003 FastCgi安装环境
    Windows2008下搭建NFS实现windows空间提供linux使用
    Spring + JdbcTemplate + JdbcDaoSupport examples
    Spring Object/XML mapping example
    Spring AOP + AspectJ in XML configuration example
    Spring AOP + AspectJ annotation example
  • 原文地址:https://www.cnblogs.com/ArdenWang/p/16112322.html
Copyright © 2020-2023  润新知