簡體   English   中英

跨不同實例對象的緩存/記憶方法調用python

[英]cache/memoize method call across different instances objects python

我試圖找出一種在對象的不同實例之間緩存方法調用結果的好方法。 我可以修改 memoize 裝飾器以刪除方法調用的第一個參數(始終是 self),或者我可以從類中刪除方法的核心並創建一個新函數,然后讓該方法調用新函數(和記住那個函數)。 我正在尋找這方面的指導。 也許我錯過了一些東西或其他解決方案。

在這個例子中,luxury_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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM