gpt4 book ai didi

python - 跨不同实例对象python的缓存/内存方法调用

转载 作者:行者123 更新时间:2023-12-05 07:34:46 25 4
gpt4 key购买 nike

我正在尝试找出一种好方法来缓存跨对象的不同实例的方法调用结果。我可以修改 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

最佳答案

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

关于python - 跨不同实例对象python的缓存/内存方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49957335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com