`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 的任何实例分配任何属性。如果该属性尚不存在,将使用新值创建它。
下面的装饰器记忆了一个传递给它的函数。我不明白这个装饰器的第一行在做什么。如果不能保证它存在,它如何能够为 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 的任何实例分配任何属性。如果该属性尚不存在,将使用新值创建它。