コードをよりクリーンにする別のアプローチは、目的のロジックを実行するラッパー関数を作成することです。
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
これで、クラスメソッドは次のようになります。次に例を示します。
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
これにより、関数への引数のセットに対して1つの値のみがキャッシュされるため、入力値に応じて異なる値を計算する場合はmemoize
、もう少し複雑にする必要があることに注意してください。