假设您有以下装饰器。如何修改它以说附加到它修饰的所有函数的某些列表引用?
def memoize(obj):
cache = obj.cache = {}
@functools.wraps(obj)
def memoizer(*args, **kwargs):
if args not in cache:
cache[args] = obj(*args, **kwargs)
return cache[args]
return memoizer
@memoize
def foo(bar):
return bar ** 3
最佳答案
您可以轻松地在装饰器函数对象上存储一个列表 (memoize.decorated
):
_decorated = []
def memoize(obj):
cache = obj.cache = {}
# add to the decorated list
_decorated.append(obj)
@functools.wraps(obj)
def memoizer(*args, **kwargs):
if args not in cache:
cache[args] = obj(*args, **kwargs)
return cache[args]
return memoizer
# make the list accessible from the decorator:
memoize.decorated = _decorated
它可以像这样使用:
@memoize
def foo(bar):
return bar ** 3
print memoize.decorated
作为旁注,您应该考虑存储 WeakRef
s in the list ,以避免内存泄漏或对象在没有其他“真实”引用时未被释放。
关于python - 如何在装饰器中注册它装饰的所有功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29926916/