Python装饰器工厂动态生成装饰器(对原装饰器参数进行处理复用)

我们先定义一个二层装饰器(函数不传参):

	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 一起参加改造,从而实现了装饰器动态复用。

你可能感兴趣的:(Python)