【问题标题】:cache/memoize method call across different instances objects python跨不同实例对象python的缓存/记忆方法调用
【发布时间】:2018-10-02 02:20:16
【问题描述】:

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

在这个例子中,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

【问题讨论】:

  • 我不明白缓存与这些有什么关系,你能解释一下吗?
  • 什么不清楚?我试图弄清楚如何缓存方法调用的结果,而不是每次都重新运行昂贵的_calc()。这里的代码是问题结构的简化示例。
  • 缓存这个词的使用让她感到困惑,因为它通常用于处理器缓存内存方面。我现在明白你想做什么了,你的论点是不变的吗?
  • 对不起,我可能应该写 memoize 更清楚。该函数没有常数参数,但这不应该是一个问题。如果您使用 memoize 装饰器,这对于常规函数来说是一个已解决的问题,但我试图让它适用于类的绑定方法。
  • 有人有想法吗?

标签: python function caching memoization


【解决方案1】:

是的,您可以使用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'

【讨论】:

    猜你喜欢
    • 2019-05-24
    • 2021-06-30
    • 2011-05-24
    • 2016-09-19
    • 2021-02-21
    • 2021-11-24
    • 2016-05-19
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多