我有一个python中的对象列表,我会定期检查并销毁其中的一些 - 最近没有访问过的那些(即没有调用方法)。
我可以保持最后一次访问并在每个方法中更新它,但有没有更优雅的方法来实现这一目标?
答案 0 :(得分:6)
使用装饰器来处理你想要用时间戳功能包装的方法,正如@Marcelo Cantos指出的那样。
考虑这个例子:
from datetime import datetime
import time
import functools
def t_access(method):
@functools.wraps(method)
def wrapper(self):
self.timestamp = datetime.now()
method(self)
return wrapper
class Foo(object):
@t_access
def bar(self):
print "method bar() called"
f = Foo()
f.bar()
print f.timestamp
time.sleep(5)
f.bar()
print f.timestamp
编辑:正如@Peter Milley指出的那样添加了functools.wraps
。
答案 1 :(得分:2)
如果您使用的是python 3.2,那么请查看functions.lru_cache()
,看看是否符合您的要求。它不会给你最后修改的时间,但它会清理未使用的对象。
对于旧版本,它可能会提供您要使用的模式,但您必须提供代码。
答案 2 :(得分:1)
Python的高度动态性使您可以编写以有趣的方式包装对象的代理。在这种情况下,您可以编写一个代理,用一个更新时间戳的包装器方法替换对象(或整个类)的方法,然后将调用委托给原始方法。
这有点牵扯。一种更简单的机制是使用Python装饰器来增强特定方法。这也允许您在调用它们时免除一些不构成“访问”的函数(如果需要)。
答案 3 :(得分:0)
您的物品的范围是什么?你能锁定它们存储和访问的位置吗?如果是这样,您应该考虑创建某种特殊容器,该容器将在上次使用或访问该对象时加上时间戳。对象的访问将受到一个函数的严格控制,该函数可以为上次访问时间加上时间戳。
答案 4 :(得分:0)
保留IMAP连接的字典,以用户ID为键。编写一个给定用户ID的函数,返回一个IMAP连接。该函数将在dict中查找用户ID,如果有用户ID,则获取相应的IMAP连接,并检查它是否仍然存在。如果为alive,则该函数返回该连接。如果不活动,或者用户ID不在dict中,则会创建新连接,将其添加到dict,然后返回新连接。无需时间戳。