对python装饰程序感到困惑。什么时候/怎样称呼他们?

对python装饰程序感到困惑。什么时候/怎样称呼他们?,python,decorator,Python,Decorator,有人能解释一下下面的代码片段吗?语法@memoize让我有点困惑。什么时候/怎么叫?它有什么作用 import functools def memoize(fn): known = dict() @functools.wraps(fn) def memoizer(*args): if args not in known: known[args] = fn(*args) return known[args]

有人能解释一下下面的代码片段吗?语法
@memoize
让我有点困惑。什么时候/怎么叫?它有什么作用

import functools

def memoize(fn):
    known = dict()

    @functools.wraps(fn)
    def memoizer(*args):
        if args not in known:
            known[args] = fn(*args)
        return known[args]

    return memoizer

@memoize
def fibonacci(n):
    '''Returns the nth number of the Fibonacci sequence'''
    assert(n >= 0), 'n must be >= 0'
    return n if n in (0, 1) else fibonacci(n-1) + fibonacci(n-2)

if __name__ == '__main__':
    print(fibonacci(10))
是同一件事吗

def fibonacci(n):
    ...

fibonacci = memoize(fibonacci)
有关装饰器如何工作的详细说明,请参见

是同一件事吗

def fibonacci(n):
    ...

fibonacci = memoize(fibonacci)

有关装饰器如何工作的详细说明,请参阅。

它是在代码加载期间调用的。这与拥有:def fibonacci(n)是一样的:#etc pass fibonacci=memoize(fibonacci)你对一般的装饰器还是memoize感到困惑吗?我这样问是因为你基本上是在问,“这段代码是做什么的?”这太宽泛了。网上有很多资源解释装饰器,还有一个关于记忆化的问题。
memoize
缓存斐波那契计算的值。如果之前计算过这些值,它会从dict
known
返回它们,并且不会重新计算它们。我对调用函数
memoize
的时间和方式感到非常困惑。我读了很多次decorators文档,但语言不是非常清晰(至少对我来说不是)。@AlexDicianu通过使用
@memoize
装饰
fibonacci
实际上是将fibonacci名称/变量绑定到
memoize(fibonacci)
返回的函数。因此,每次调用
fibonacci
时,都会“隐式”调用
memoizer
,而定义
fibonacci
时,会调用一次
memoize
。这与拥有:def fibonacci(n)是一样的:#etc pass fibonacci=memoize(fibonacci)你对一般的装饰器还是memoize感到困惑吗?我这样问是因为你基本上是在问,“这段代码是做什么的?”这太宽泛了。网上有很多资源解释装饰器,还有一个关于记忆化的问题。
memoize
缓存斐波那契计算的值。如果之前计算过这些值,它会从dict
known
返回它们,并且不会重新计算它们。我对调用函数
memoize
的时间和方式感到非常困惑。我读了很多次decorators文档,但语言不是非常清晰(至少对我来说不是)。@AlexDicianu通过使用
@memoize
装饰
fibonacci
实际上是将fibonacci名称/变量绑定到
memoize(fibonacci)
返回的函数。因此,每次调用
fibonacci
时,都会“隐式”调用
memoizer
,而在定义
fibonacci
fibonacci=memoize(fibonacci)
时,
fibonacci=memoize(fibonacci)
会调用一次
,没有了争论,我更新了我的答案。