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,并传递给cPult.PRI .

内置代码>代码>功能工具.LuuRuxCase<代码>似乎没有这个问题,因此您可以考虑使用IITT的技巧来访问cScript的<代码>自<代码>内部>代码>记住< /COD>。方法绑定过程只对函数对象自动起作用,
memory
是一个dict,而不是一个函数。您可以通过重写Memory的
\uuu get\uuuu
来实现方法绑定,但是这样做太复杂了,以至于您失去了最初使您的原始想法具有吸引力的简洁性。在这一点上,最好只编写一个普通的基于函数的decorator。您想要一个处理所有
cExample
实例的缓存,还是希望每个实例都有自己的缓存?如果是前者,是否希望缓存忽略
self