我有这个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')
答案 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")