You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类实例中为cachetools的ttl_cache设置不同TTL值?

给类的每个实例设置独立TTL的ttl_cache实现方案

因为装饰器在类定义阶段就会执行,这时候还没有实例,自然拿不到self.ttl。下面提供两种实用的解决思路:

方法一:在实例初始化时动态装饰方法

把缓存装饰的步骤移到__init__里,等实例创建完成后,再给当前实例的方法单独加上对应TTL的缓存:

import cachetools

class MyClass:
    def __init__(self, ttl):
        self.ttl = ttl
        # 动态为当前实例的方法绑定带指定TTL的缓存
        self.expensive_operation = cachetools.func.ttl_cache(ttl=self.ttl)(self.expensive_operation)

    def expensive_operation(self):
        # 模拟耗时操作
        print("执行耗时操作...")
        return "操作结果"

说明:每个实例初始化时,都会基于自身的ttl值生成独立的缓存装饰器,不同实例的缓存空间完全隔离,TTL参数各自生效。

方法二:自定义延迟绑定TTL的装饰器

如果不想修改__init__的逻辑,可以写一个自定义装饰器,延迟到方法首次调用时,再从实例中获取TTL并创建缓存:

import cachetools

def instance_ttl_cache():
    def decorator(func):
        def wrapper(self, *args, **kwargs):
            # 检查当前实例是否已生成缓存后的方法
            cache_attr_name = f"_cached_{func.__name__}"
            if not hasattr(self, cache_attr_name):
                # 用实例的ttl值创建缓存装饰后的方法并绑定到实例
                cached_func = cachetools.func.ttl_cache(ttl=self.ttl)(func)
                setattr(self, cache_attr_name, cached_func)
            # 调用缓存后的方法
            return getattr(self, cache_attr_name)(*args, **kwargs)
        return wrapper
    return decorator

class MyClass:
    def __init__(self, ttl):
        self.ttl = ttl

    @instance_ttl_cache()
    def expensive_operation(self):
        print("执行耗时操作...")
        return "操作结果"

说明:第一次调用方法时,装饰器会根据当前实例的ttl生成专属的缓存函数,后续调用直接复用这个缓存版本,确保每个实例的TTL规则独立。

验证效果

你可以创建不同TTL的实例测试,两个实例的缓存互不干扰:

# TTL为10秒的实例
obj1 = MyClass(10)
obj1.expensive_operation()  # 打印"执行耗时操作..."
obj1.expensive_operation()  # 直接返回缓存结果,无打印

# TTL为30秒的实例
obj2 = MyClass(30)
obj2.expensive_operation()  # 打印"执行耗时操作..."
obj2.expensive_operation()  # 直接返回缓存结果

内容的提问来源于stack exchange,提问作者aberger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:30:28