Skip to content

Instantly share code, notes, and snippets.

@jefftriplett
Forked from codysoyland/methodmemoize.py
Created January 4, 2010 23:48
Show Gist options
  • Save jefftriplett/268998 to your computer and use it in GitHub Desktop.
Save jefftriplett/268998 to your computer and use it in GitHub Desktop.
import functools
class memoize(object):
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
return self.cache_get(args, lambda: self.func(*args))
def __get__(self, obj, objtype):
return self.cache_get(id(obj), lambda: self.__class__(functools.partial(self.func, obj)))
def cache_get(self, key, gen_callback):
try:
return self.cache[key]
except KeyError:
self.cache[key] = gen_callback()
return self.cache[key]
class Adder(object):
@memoize
def add(self, arg1, arg2):
print 'CALCULATING', arg1, '+', arg2
return arg1 + arg2
@memoize
def subtract(arg1, arg2):
print 'CALCULATING', arg1, '-', arg2
return arg1 - arg2
def main():
print subtract(10, 5)
print subtract(10, 5)
adder1 = Adder()
adder2 = Adder()
print adder1.add(5, 5)
print adder1.add(5, 5)
print adder2.add(5, 5)
print adder2.add(5, 5)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment