cache / memoize方法调用跨越不同实例的对象python

时间:2018-04-21 15:28:47

标签: python function caching memoization

我试图找出一种在对象的不同实例之间缓存方法调用结果的好方法。我可以修改memoize装饰器来删除方法调用的第一个参数(总是自己),或者我可以从类中删除方法的核心并创建一个新函数然后让方法调用新函数(和记住那个功能)。我正在寻找这方面的指导。也许有一些我错过的或其他解决方案。

在这个例子中,expensive_calc()是一个静态方法,但在我的应用程序中却不是。假设只要函数参数相同,它将始终返回相同的数据,而不管对象属性如何。还给出了我的应用程序的设计方式,将它保持为类函数更方便。

from time import sleep

class Test(object):

    def expensive_calc(self, arg, kwarg1):

        sleep(5)

obj1 = Test()
obj2 = Test()

obj1.expensive_calc(1, kwarg1=1)
obj2.expensive_calc(1, kwarg1=1) # Would like this use the cache

1 个答案:

答案 0 :(得分:0)

是的,您可以使用self.__class__

将变量分配给类定义

这是一个例子

class Test:
    def self_assign(self):
        if not hasattr(self.__class__, 'storage'):
            self.__class__.storage = 'useful data'
    def get_self_assign_value(self):
        return getattr(self.__class__, 'storage')

使用中:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Test:
  :  def self_assign(self):
   :     if not hasattr(self.__class__, 'storage'):
 :           self.__class__.storage = 'useful data'
  :  def get_self_assign_value(self):
       : return getattr(self.__class__, 'storage')
:<EOF>

In [2]:

In [2]: test1 = Test()

In [3]: test2 = Test()

In [4]: test1.get_self_assign_value()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-88e253d48023> in <module>
----> 1 test1.get_self_assign_value()

<ipython-input-1-e186ef60b5aa> in get_self_assign_value(self)
      4             self.__class__.storage = 'useful data'
      5     def get_self_assign_value(self):
----> 6         return getattr(self.__class__, 'storage')

AttributeError: type object 'Test' has no attribute 'storage'

In [5]: test2.get_self_assign_value()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-60a245b44dc0> in <module>
----> 1 test2.get_self_assign_value()

<ipython-input-1-e186ef60b5aa> in get_self_assign_value(self)
      4             self.__class__.storage = 'useful data'
      5     def get_self_assign_value(self):
----> 6         return getattr(self.__class__, 'storage')

AttributeError: type object 'Test' has no attribute 'storage'

In [6]: test1.self_assign()

In [7]: test1.get_self_assign_value()
Out[7]: 'useful data'

In [8]: test2.get_self_assign_value()
Out[8]: 'useful data'