在Python中,我对装饰器有所了解。 在我理解不充分的情况下,装饰函数声明会返回装饰器函数与原始函数构造的任何内容(最合理的是它应该是可调用的):
def deco(func):
def func_wrapper(name):
return func(name)+", how are you?"
return func_wrapper
@deco
def foo(name):
return "Hello "+name
print(foo("Michael"))
这给出了:
Hello Michael, how are you?
但是如果指定了装饰器和参数,那该怎么办:
def deco2(info):
def info_decorator(func):
def func_wrapper(name):
return func(name) + info
return func_wrapper
return info_decorator
@deco2(", how are you?")
def foo2(name):
return "Hello "+name
print(foo2("Regina"))
给
Hello Regina, how are you?
什么是"规则"处理这个装饰?
似乎,而不是返回foo2
Python首先使用给定的arg调用deco2
,而 假定 ,这个调用首先构造一个装饰器的工厂,然后像foo2一样传递给它,以便返回最终的包装器。但是,在这种情况下,还有一个" 层"涉及(三个def而不是两个),这使我很难确定一般规则。
答案 0 :(得分:3)
如果您应用不带参数的装饰器,例如@foo
,然后装饰器将被装饰的函数作为其参数,并且应该返回将替换装饰函数的任何可调用函数。
如果您使用参数应用装饰器,例如@foo('bar')
,那么装饰器应该返回一个可调用的函数,它将把装饰函数作为参数,并返回并调用它来替换装饰函数。
换句话说:没有参数的装饰器只需要被装饰的函数,但是带参数的装饰器需要自己的参数和它需要以某种方式获取被装饰的函数。由于装饰器的参数是任意的并且不受任何限制,因此很难提出关于如何另外将decoratee传递给它的任何非限制性规则。在这种情况下,应用两步过程:获取装饰器参数,然后返回另一个带有decoratee的callable。