[英]Memoize decorator not returning actual value
我有这个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')
由于property
对象缺少__module__
和其他属性,因此应将其装饰器用作最后一个装饰器:
class QClass(object):
@property
@memoize
def positive(self):
return Predicate('positive')
或者在备忘录装饰器中指定分配的可用属性:
def memoize(obj):
@functools.wraps(obj, assigned=('__doc__',))
def memoizer(*args, **kwargs):
…
我的一位同事回答了这个问题。
装饰器可以这样写:
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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.