Python装饰器

Python装饰器,python,closures,decorator,Python,Closures,Decorator,我有一个关于装饰师的问题。我了解什么是装饰师,我知道如何使用它,我已经阅读了所有的教程 我明白: >>> def my_decorator(fn): >>> print 'Do something before' >>> print fn() >>> def foo(): >>> return 'Hello World!' >>> foo = my_decor

我有一个关于装饰师的问题。我了解什么是装饰师,我知道如何使用它,我已经阅读了所有的教程

我明白:

>>> 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是一个只接受一个参数的函数。这个参数是函数-这是我对Decorator的定义。在您的情况下,包装器是装饰器。而my_decorator用于收集内部_函数的参数。内部_函数用于替换原始[未装饰]函数。逐步解释如下:

调用my_decorator来收集内部_函数的选项 我的装饰返回包装 包装器负责捕获原始函数,或者换句话说,修饰它。在您的例子中,原始函数是foo。 包装器返回原始函数的替换函数,该替换函数是内部函数 从现在起,foo指向内部函数,因此执行内部函数,然后调用foo
希望它能让事情更清楚一点。

Decorator是一个带一个参数的函数。这个参数是函数-这是我对Decorator的定义。在您的情况下,包装器是装饰器。而my_decorator用于收集内部_函数的参数。内部_函数用于替换原始[未装饰]函数。逐步解释如下:

调用my_decorator来收集内部_函数的选项 我的装饰返回包装 包装器负责捕获原始函数,或者换句话说,修饰它。在您的例子中,原始函数是foo。 包装器返回原始函数的替换函数,该替换函数是内部函数 从现在起,foo指向内部函数,因此执行内部函数,然后调用foo 希望它能让事情更清楚一点。

我找到了解决方案:

实际上,装饰器使用闭包功能: 因此,这里有一个解决方案,在没有装饰器和参数的情况下做同样的事情,它只是为了理解操作和学习

def wrapper(str):
    def decorator_factory(fn):
        def inner_function(*args):
            print 'Do something before'
            return fn(*args)
        return inner_function
    return decorator_factory

@my_decorator('test')
def foo(a, b):
    return a + b

# with decorator
print foo(1, 1)

# without decorator
print wrapper('str')(foo)(1, 1)
我找到了解决办法:

实际上,装饰器使用闭包功能: 因此,这里有一个解决方案,在没有装饰器和参数的情况下做同样的事情,它只是为了理解操作和学习

def wrapper(str):
    def decorator_factory(fn):
        def inner_function(*args):
            print 'Do something before'
            return fn(*args)
        return inner_function
    return decorator_factory

@my_decorator('test')
def foo(a, b):
    return a + b

# with decorator
print foo(1, 1)

# without decorator
print wrapper('str')(foo)(1, 1)

因为装饰师就是这么做的。这不是一个简单的函数调用,它是一个decorator,它作为第一个参数传递给它下面的函数,返回的函数替换它。这并不神奇——就像问为什么函数调用它之后的括号一样——它是语言的一个文档化部分。没有@decorator,我不能做同样的事情是什么意思?请给出一个例子。在第一个例子中,我可以看到什么是decoratory你可以做foo=my_decorator'test'foo,作为@syntax的替代。因为decorator就是这么做的。这不是一个简单的函数调用,它是一个decorator,它作为第一个参数传递给它下面的函数,返回的函数替换它。这并不神奇——就像问为什么函数调用它之后的括号一样——它是语言的一个文档化部分。没有@decorator,我不能做同样的事情是什么意思?请举个例子。在第一个例子中,我可以看到什么是装饰你可以做的foo=my_装饰'test'foo,作为@syntax的替代。谢谢你的评论帮助我找到了decorator是如何调用所有函数的谢谢你的评论帮助我找到了decorator是如何调用所有函数的另一种方式是:实际的decorator=my_decorator'some_string'。你看,函数my_decorator在本例中的名称有点不恰当,因为它本身并不是一个真正的decorator,而是一个返回带有闭包的decorator的包装器。这个返回的decorator就是应用于foo的decorator。所以我必须在wrapper中命名我的\u decorator?另一种方法是:实际的\u decorator=my\u decorator'some\u string'。你看,函数my_decorator在本例中的名称有点不恰当,因为它本身并不是一个真正的decorator,而是一个返回带有闭包的decorator的包装器。这个返回的decorator就是应用于foo的decorator。所以我必须在wrapper中命名我的_decorator?