我有一个关于装饰器的问题。我明白了什么是装饰,我知道如何使用它,我已阅读所有本教程How to make a chain of function decorators?Python装饰器
我的理解是:
>>> 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)
这怎么可能?
因为这就是装饰者所做的事情。这不是一个简单的函数调用,它是一个装饰器,并且它作为第一个参数传递给它下面的函数(并且返回的函数将替换它)。 –
这是神奇的? – Freelancer
这完全不是魔术 - 这就像问一个函数后面的括号为什么叫它 - 它是该语言的文档化部分。 –