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

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

附带说明一下,您应该考虑存储 WeakRefs in the list,以避免内存泄漏或对象在没有其他 "real" 引用时未被释放。