如何优雅地跟踪一个Python对象的最后访问时间?
我在Python中有一个对象列表,我会定期检查这些对象,并删除一些最近没有被访问的对象(也就是说,没有调用过它们的方法)。
我可以记录每个对象最后被访问的时间,并在每个方法中更新这个时间,但有没有更简单优雅的方法来做到这一点呢?
5 个回答
1
Python的灵活性很高,这让你可以用有趣的方式来创建代理,来包装对象。在这个例子中,你可以写一个代理,它会把一个对象(或者整个类)的方法替换成一些新的方法,这些新方法会先更新一个时间戳,然后再调用原来的方法。
这个过程有点复杂。一个更简单的方法是使用Python的装饰器,来增强特定的方法。这样做还可以让你在调用时排除一些不算“访问”的函数(如果你需要这样做的话)。
2
如果你在用 Python 3.2,可以看看 functions.lru_cache()
这个功能,看看它是否能满足你的需求。虽然它不会给你最后修改的时间,但它可以帮你清理那些没用的对象。
对于旧版本的 Python,它可能会给你一些你想用的思路,但你需要自己写代码来实现。
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
。