【发布时间】:2013-08-07 12:47:35
【问题描述】:
我有一个关于装饰器的问题。我了解什么是装饰器并且我知道如何使用它,我已经阅读了所有教程How to make a chain of function decorators?
我明白了:
>>> 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)
这怎么可能?
【问题讨论】:
-
因为这就是装饰器所做的。这不是一个简单的函数调用,它是一个装饰器,它通过它下面的函数作为第一个参数(并且返回的函数替换它)。
-
这并不完全是魔法——这就像问为什么函数后面的括号会调用它——它是语言的文档化部分。
-
“没有@decorator,我无法做同样的事情”是什么意思?请举个例子。
-
和第一个例子一样,我可以看到什么是装饰器
-
您可以使用
foo = my_decorator('test')(foo),作为@语法的替代。