跟踪上次访问python对象的最优雅方法是什么?

时间:2011-06-05 06:55:40

标签: python class object tracking

我有一个python中的对象列表,我会定期检查并销毁其中的一些 - 最近没有访问过的那些(即没有调用方法)。

我可以保持最后一次访问并在每个方法中更新它,但有没有更优雅的方法来实现这一目标?

5 个答案:

答案 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,然后返回新连接。无需时间戳。