我不明白为什么仅在第一次调用函数multiply(x,y)时执行“cache = {}”行。之后,该行被忽略。这使程序运行良好,但我不理解这种行为。
def memoize(func):
cache = {}
print("cache")
@functools.wraps(func)
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
@memoize
def multiply(x, y):
return x * y
print(multiply(2, 3))
print(multiply(2, 3))
结果是:
cache
6
6
因此,行“cache = {}”和“print(”cache“)”仅在第一次执行时执行。 感谢
答案 0 :(得分:1)
装饰器代码的一部分,每次执行""是包装函数。包装函数外部的代码仅在应用运算符时执行 -
这没有什么神奇之处或者#34;新的" - 只看到事物的顺序和什么时候被称为 - 正常的执行顺序中唯一被称为有点魔法的东西就是装饰本身 - 只记得:
@memoize
def multiply(x, y):
return x * y
与以下内容完全相同:
def multiply(x, y):
return x * y
multiply = memoize(multiply)
此外,如果您正在尝试了解装饰器,请暂时不要使用functools.wraps
来电。它适用于生产代码和填充小细节:它将您的包装函数伪装成它所装饰的内部函数(例如,函数wrapper
__name__
属性设置为multiply
在这个例子中),但在尝试理解装饰器时是不必要的复杂功能。