我有一个关于装饰器的问题。我了解什么是装饰器并且知道如何使用它,我已经阅读了本教程的所有内容如何制作函数装饰器链?
我明白那个 :
>>> def my_decorator(fn):
>>> print 'Do something before'
>>> print fn()
>>> def foo():
>>> return 'Hello World!'
>>> foo = my_decorator(foo)
是一样的:
>>> def my_decorator(fn):
>>> print 'Do something before'
>>> print fn()
>>> @my_decorator
>>> def foo():
>>> return 'Hello World!'
我知道什么是闭包以及为什么我们在带参数的装饰器中使用闭包(以获取嵌套函数中的装饰器参数),但我不明白为什么我们使用闭包和嵌套函数来获取参数和函数。
闭包(或其他东西)如何访问外部参数和函数。没有@decorator,我无法做同样的事情。
例如,在这里我可以访问我的 foo() 和函数的参数,而无需在参数中传递此函数:
def my_decorator(str):
def wrapper(fn):
def inner_function(*args):
print 'Do something before'
return fn(*args)
return inner_function
return wrapper
@my_decorator('test')
def foo(a, b):
return a + b
print foo(1, 1)
这怎么可能?