7 python decorator python-decorators
假设您有以下装饰器.如何修改它来附加一些列表引用它所装饰的所有函数?
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
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将列表存储在装饰器函数对象 ( 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
Run Code Online (Sandbox Code Playgroud)
它可以像这样使用:
@memoize
def foo(bar):
return bar ** 3
print memoize.decorated
Run Code Online (Sandbox Code Playgroud)
作为旁注,您应该考虑将WeakRefs 存储在 list 中,以避免内存泄漏或当没有留下对它们的其他“真实”引用时对象无法被释放。
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |