Python 如何将记忆修饰符应用于实例方法?
我想在类方法上使用记忆装饰器Python 如何将记忆修饰符应用于实例方法?,python,python-3.x,python-decorators,Python,Python 3.x,Python Decorators,我想在类方法上使用记忆装饰器cExample.pri()调用self.text()但是memory似乎不知道self。当memory调用self.func(*key)时,它缺少cExampleobj,因此它抱怨缺少参数 如何更改此记忆装饰器,使其能够将调用方的self传递给函数 蟒蛇3.5.2 class memorize(dict): def __init__(self, func): self.func = func def __call__(self, *
cExample.pri()
调用self.text()
但是memory
似乎不知道self
。当memory
调用self.func(*key)
时,它缺少cExample
obj,因此它抱怨缺少参数
如何更改此记忆装饰器,使其能够将调用方的self
传递给函数
蟒蛇3.5.2
class memorize(dict):
def __init__(self, func):
self.func = func
def __call__(self, *args):
return self[args]
def __missing__(self, key):
result = self[key] = self.func(*key)
return result
class cExample():
@memorize
def pri(self, text):
return self.text(text)
def text(self, text):
return text
c = cExample()
print(c.pri('hi'))
输出:
Traceback (most recent call last):
File "x.py", line 23, in <module>
print(c.pri('hi'))
File "x.py", line 7, in __call__
return self[args]
File "x.py", line 11, in __missing__
result = self[key] = self.func(*key)
TypeError: pri() missing 1 required positional argument: 'text'
回溯(最近一次呼叫最后一次):
文件“x.py”,第23行,在
打印(c.pri('hi'))
调用中第7行的文件“x.py”__
返回自我[args]
文件“x.py”,第11行,缺少__
结果=自[键]=自函数(*键)
TypeError:pri()缺少1个必需的位置参数:“text”
您需要将self
(即c
)传递到cExample.pri
(即self.func
)。但是\uuu缺少\uuu
不允许您这样做:它只接收密钥
您可以使用基于函数的装饰器重写它:
import functools
def memorize2(f):
cache = {}
@functools.wraps(f)
def wrapper(*args):
if args not in cache:
cache[args] = f(*args)
return cache[args]
return wrapper
class cExample():
@memorize2
def pri(self, text):
return self.text(text)
def text(self, text):
return text
c = cExample()
print(c.pri('hi')) # hi
(我正在使用不丢失装饰方法的原始名称)
此方法<代码>自我>代码>作为位置ARG,并传递给
memory
是一个dict,而不是一个函数。您可以通过重写Memory的\uuu get\uuuu
来实现方法绑定,但是这样做太复杂了,以至于您失去了最初使您的原始想法具有吸引力的简洁性。在这一点上,最好只编写一个普通的基于函数的decorator。您想要一个处理所有cExample
实例的缓存,还是希望每个实例都有自己的缓存?如果是前者,是否希望缓存忽略self
?