了解这个备忘录

2024-09-26 22:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解这个回忆录装潢师

def method(func):
    """
    Decorator for caching parameterless bound method
    """
    key = '_memoize_%s' % func.__name__
    @wraps(func)
    def wrapper(self):
        if not hasattr(self, key):
            setattr(self, key, func(self))
        return getattr(self, key)

    return wrapper

假设我有:

^{pr2}$

它是否将一个键_memoize_add附加到元组(x,y),因为这就是传递给包装器的内容。在


Tags: keyselfforreturndefdecoratorwrappermethod
1条回答
网友
1楼 · 发布于 2024-09-26 22:53:31

decorator将方法的返回值存储为私有属性。所以它只适用于类实例,而不适用于普通函数。在

decorator的func参数是它包装的方法,返回的wrapper函数将被调用,而不是方法。当包装器被调用时,它的self参数将是该类的实例,settattr调用将把func的结果缓存为key命名的私有属性。之后,所有进一步的调用将返回key属性的缓存值。在

下面是一个简单的测试,演示如何使用它:

import random
from functools import wraps

def method(func):
    key = '_memoize_%s' % func.__name__
    @wraps(func)
    def wrapper(self):
        if not hasattr(self, key):
            setattr(self, key, func(self))
        return getattr(self, key)

    return wrapper

class Test(object):
    @method
    def cached(self):
        return random.random()

    def uncached(self):
        return random.random()

t = Test()
for x in range(3):
    print('cached: %s' % t.cached())
    print('uncached: %s' % t.uncached())
print(t.__dict__)

输出:

^{pr2}$

相关问题 更多 >

    热门问题