当前位置: 首页 > 面试题库 >

在Python中缓存类属性

郎项禹
2023-03-14
问题内容

我正在用python写一个类,并且我有一个属性,该属性将花费相对较长的时间来计算,因此 我只想执行一次 。此外,它会不会被类的每个实例需要的,所以
我不想在默认情况下做到这一点__init__

我是Python的新手,但不是编程人员。我可以想出一种很容易做到这一点的方法,但是我一遍又一遍地发现,“
Pythonic”做事的方法通常比我在其他语言中的经验要简单得多。

在Python中是否有“正确”的方法来做到这一点?


问题答案:

Python≥3.8
@property@functools.lru_cache已合并为@cached_property

import functools
class MyClass:
    @functools.cached_property
    def foo(self):
        print("long calculation here")
        return 21 * 2

Python≥3.2 <3.8

您应该同时使用@property@functools.lru_cache装饰器:

import functools
class MyClass:
    @property
    @functools.lru_cache()
    def foo(self):
        print("long calculation here")
        return 21 * 2

该答案有更详细的示例,还提到了先前Python版本的反向移植。

Python <3.2

Python
Wiki具有一个缓存的属性装饰器(由MIT许可),可以这样使用:

import random
# the class containing the property must be a new-style class
class MyClass(object):
   # create property whose value is cached for ten minutes
   @cached_property(ttl=600)
   def randint(self):
       # will only be evaluated every 10 min. at maximum.
       return random.randint(0, 100)

或者其他提及的任何实现都可以满足您的需求。
或上述反向端口。



 类似资料:
  • 问题内容: 我正在写一个轻量级的类,其属性旨在可公开访问,并且有时仅在特定的实例中被覆盖。就此而言,Python语言中没有为类属性或任何类型的属性创建文档字符串的规定。记录这些属性的预期方式和受支持方式是什么?目前,我正在做这种事情: 这将导致该类的docstring包含初始的标准docstring部分,以及通过对的扩展分配为每个属性添加的行。 尽管在文档字符串样式指南中似乎并未明确禁止使用这种样

  • 问题内容: 在下面的python脚本中,为什么要执行第二个断言(即,将0加到257并将结果存储在y中,则x和y成为不同的对象)?谢谢! 问题答案: 整数是不可变的,因此任何更改它们的操作都将导致新的内存位置 正在检查对象的实际内存位置…并且基本上不应该用于检查值的相等性(尽管它可以在某些情况下任意工作)

  • 我正在尝试使用spring Cache实现对我的方法的缓存。问题是第一次执行后这个方法没有被执行,这意味着属性没有被加载。如果我删除@cacheable注释,它工作得很好。我的要求是,每当添加新属性时,这个方法才应该运行并加载属性,否则它应该从缓存返回。 XML文件:

  • 问题内容: 我想将-object 保存到Android存储中的某个位置以快速检索并在其中显示数据。 这可能吗?如果可以,那么SQLite或外部存储适合哪种技术? 问题答案: 例。 并从活动中致电 不要忘记在清单文件中使用write_external_storage权限。

  • 我使用的是完全修补过的Visual Studio 2013。我正在尝试使用JQuery、JQueryUI和JSRender。我也在尝试使用打字。在ts文件中,我得到如下错误: 类型“{}”上不存在属性“fade div”。

  • 我试图在登录过程后获得连接的用户模型, 首先,在CanActivate guard检查了带有用户JSON对象的本地存储并发现该对象为空之后,用户将重定向到“/login”URL 然后用户登录并重定向回根URL“/”,在连接过程中我使用AuthService,它将从服务器返回的用户对象保存在用户模型中 这是我的守卫: