如何在类实例中为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
相关产品推荐
相关产品推荐

