我们先定义一个二层装饰器(函数不传参):
def deco(*arg):
def inner(func):
return func
return inner
这种装饰器应该大家很常见了,*arg
是该装饰器的传入参数。
当我们有其他需求时(比如传入参数不同,但业务基本相同),又不想浪费旧装饰器,可以做一个装饰器工厂:
def deco_maker(deco_name, *arg):
def deco_deco(*args):
def inner(func):
deco_name(*args)(func)
return func
return inner
return deco_deco
这里我们写了一个工厂方法 deco_maker
,对旧装饰器的改造需要的参数在此方法上传入,比如:
new_deco = deco_maker(deco, *arg)
那么我们就生成了一个新的装饰器叫 new_deco
,改造旧装饰器需要的参数在 *arg
传入。
那如何改造?
可以看出我们在装饰器工厂 deco_maker
里回弹了一个装饰器,这个装饰器要执行旧装饰器需要的方法是:
deco_name(*args)(func)
这里的 *args
是新装饰器上的参数,上文我们说的 *arg
是用来改造旧装饰器的参数,不要搞混了。
我们这里只是简单地把新装饰器的参数 *args
传给了旧装饰器,如果要改造,应该是用改造参数 *arg
做一些处理,当然你在逻辑中可能需要用到新装饰器传入的参数 *args
一起参加改造,从而实现了装饰器动态复用。