在 Scala 中,lazy val
是一个 final 变量,它在第一次访问时被评估一次,而不是在它被声明的时候。它本质上是一个没有参数的记忆函数。这是在 Python 中实现 memoization 装饰器的一种方法:
from functools import wraps
def memoize(f):
@wraps(f)
def memoized(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items()))) # make args hashable
result = memoized._cache.get(key, None)
if result is None:
result = f(*args, **kwargs)
memoized._cache[key] = result
return result
memoized._cache = {}
return memoized
这是它的使用方法。你甚至可以去掉property
空括号,就像 Scala 一样:
>>> class Foo:
... @property
... @memoize
... def my_lazy_val(self):
... print "calculating"
... return "some expensive value"
>>> a = Foo()
>>> a.my_lazy_val
calculating
'some expensive value'
>>> a.my_lazy_val
'some expensive value'