如何在装饰器中注册它装饰的所有功能?
How to register within a decorator all functions it decorates?
假设您有以下装饰器。如何修改为附加到它修饰的所有函数的某些列表引用?
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,以避免内存泄漏或对象在没有其他 "real" 引用时未被释放。
假设您有以下装饰器。如何修改为附加到它修饰的所有函数的某些列表引用?
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,以避免内存泄漏或对象在没有其他 "real" 引用时未被释放。