Memoize装饰器不返回实际值

时间:2015-06-09 03:32:36

标签: python

我有这个memoize装饰器:

import functools

cache = {}

def memoize(obj):
    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        if args not in cache:
            cache[args] = obj(*args, **kwargs)
        return cache[args]
    return memoizer

对于该类的任何方法都可以正常工作。但是,与@property装饰器一起使用时会出现以下错误。

AttributeError: 'property' object has no attribute '__module__'

如何使用类的@property方法?

提前致谢!

更新

class QClass(object):
    @memoize
    @property
    def positive(self):
        return Predicate('positive')

2 个答案:

答案 0 :(得分:0)

作为property对象未命中__module__和其他属性,您应该将其装饰器应用为最后一个:

class QClass(object):
    @property
    @memoize
    def positive(self):
        return Predicate('positive')

或者在memoize decorator中指定赋值的可用属性:

def memoize(obj):
    @functools.wraps(obj, assigned=('__doc__',))
    def memoizer(*args, **kwargs):
        …

答案 1 :(得分:0)

我的一位同事回答了这个问题。

装饰者可以这样写:

from functools import update_wrapper
predicate_cache = {}

def cached_property(cache):
    """Create a property, where the lookup is stored in ``cache``"""
    def decorator(method):
        name = method.__name__
        def wrapper(self):
            if name not in cache:
                cache[name] = method(self)
            return cache[name]   
        return property(update_wrapper(wrapper, method))
    return decorator

它可以像这样使用:

predicate_cache = {}

class QClass(object):
    @cached_property(predicate_cache)
    def positive(self):
        """..."""
        return Predicate("positive")