我正在使用这里的 memoize 配方,并针对返回 2 个值的函数稍微修改了它。我使用这个包装器来创建两个单独的函数,它们分别返回第一个和第二个值,但是函数评估被缓存,因此当使用相同的参数调用任何一个返回的函数时没有开销。这是此包装器的代码。
def memoize(obj, cache_limit=10):
'''
This function caches the return value each time it is called. partial() is used to return the appropriate value.
Cache size is limited to 10
See here for details on this design pattern: https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
'''
cache = obj.cache = {}
key_cache = collections.deque()
@functools.wraps(obj)
def memoizer(which, *args, **kwargs):
key = str(args)
if key not in cache:
cache[key] = obj(*args, **kwargs)
key_cache.append(key)
if len(key_cache) >= cache_limit:
del cache[key_cache.popleft()]
return cache[key][which]
return functools.partial(memoizer, 0), functools.partial(memoizer, 1)
现在,我正在尝试f
在以这种方式在类中定义的函数上使用它:
class test_function:
def __init__(self):
''''''
def f(self,x):
return 2*x, 3*x
我这样称呼它
a = test_function()
f_v1, f_v2 = memoize(a.f)
如果成功f_v1(x)
将返回2x
并将f_v2(x)
返回3x
。但这失败并出现错误:
AttributeError: 'instancemethod' object has no attribute 'cache'
如果函数在类之外声明,我的代码可以正常工作。我错过了什么?我正在使用Python 2.7
.