如何在装饰器中注册它装饰的所有功能?

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)

shx*_*hx2 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
Run Code Online (Sandbox Code Playgroud)

它可以像这样使用:

@memoize
def foo(bar):
    return bar ** 3

print memoize.decorated
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该考虑将WeakRefs 存储在 list 中,以避免内存泄漏或当没有留下对它们的其他“真实”引用时对象无法被释放。

  • 不鼓励在名称的开头和结尾使用 `__`,因为这些应该仅用于 Python 内部。没有真正的理由在这里使用前导 __` 。(我想说没有太多理由使用哪怕一个下划线,但这更有争议。) (2认同)