在这个装饰器中`cache = obj.cache = {}`做了什么?

时间:2015-08-24 02:31:13

标签: python memoization

以下装饰器会记忆传递给它的函数。我不明白这个装饰器的第一行是做什么的。如果不保证它存在,如何为 def memoize(obj): cache = obj.cache = {} @functools.wraps(obj) def memoizer(*args, **kwargs): if args not in cache: cache[args] = obj(*args, **kwargs) return cache[args] return memoizer 分配值?

{{1}}

2 个答案:

答案 0 :(得分:2)

从评论中看来,您的问题似乎与多项任务没有任何关系。您只是想知道如果obj.cache = {}没有名为obj的属性,cache如何运作。

答案是在Python中,属性不需要预先声明。除非您特别为您的类编码以限制更多,否则您可以随时在任何用户定义的类的任何实例上分配任何属性。如果该属性尚不存在,则将使用新值创建该属性。

答案 1 :(得分:0)

在Python中,设置不存在的属性会创建该属性。我认为大多数动态语言都是这样的。因此,cache = obj.cache = {}会在cache上创建属性obj,并将其设置为{}