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

What does `cache = obj.cache = {}` do in this decorator?

下面的装饰器记忆了一个传递给它的函数。我不明白这个装饰器的第一行在做什么。如果不能保证它存在,它如何能够为 obj.cache 赋值?

  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

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

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

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