参数化装饰器

解析源码中的装饰器时,Python 把被装饰的函数作为第一个参数传给装 饰器函数。那怎么让装饰器接受其他参数呢?答案是:创建一个装饰器 工厂函数,把参数传给它,返回一个装饰器,然后再把它应用到要装饰 的函数上。不明白什么意思?当然。下面以我们见过的最简单的装饰器 为例说明:
registry = set() ➊
def register(active=True): ➋
  def decorate(func): ➌
    print('running register(active=%s)->decorate(%s)'% (active, func))
    if active: ➍
      registry.add(func)
    else:
      registry.discard(func) ➎
    return func ➏
  return decorate ➐
@register(active
=False) ➑ def f1():   print('running f1()')
@register() ➒
def f2():   print('running f2()')
def f3():   print('running f3()')
>>> import registration_param
running register(active=False)->decorate(<function f1 at 0x10063c1e0>)
running register(active=True)->decorate(<function f2 at 0x10063c268>)
>>> registration_param.registry
{<function f2 at 0x10063c268>}

 

posted @ 2019-10-14 18:10  顽强的allin  阅读(321)  评论(0编辑  收藏  举报