另一种使代码更简洁的方法是编写一个执行所需逻辑的包装函数:
def memoize(f):
def wrapped(*args, **kwargs):
if hasattr(wrapped, '_cached_val'):
return wrapped._cached_val
result = f(*args, **kwargs)
wrapped._cached_val = result
return result
return wrapped
您可以按如下方式使用它:
@memoize
def expensive_function():
print "Computing expensive function..."
import time
time.sleep(1)
return 400
print expensive_function()
print expensive_function()
print expensive_function()
哪个输出:
Computing expensive function...
400
400
400
现在您的 classmethod 将如下所示,例如:
class MyClass(object):
@classmethod
@memoize
def retrieve_data(cls):
print "Computing data"
import time
time.sleep(1) #costly DB call
my_data = 40
return my_data
print MyClass.retrieve_data()
print MyClass.retrieve_data()
print MyClass.retrieve_data()
输出:
Computing data
40
40
40
请注意,这将为函数的任何一组参数只缓存一个值,因此如果您想根据输入值计算不同的值,您将不得不变得memoize
更复杂一些。