如何优雅地跟踪一个Python对象的最后访问时间?

6 投票
5 回答
850 浏览
提问于 2025-04-16 18:58

我在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

撰写回答