2011-06-05 34 views
5

我有一個python中的對象列表,我會定期檢查並銷燬它們中的一些 - 那些最近未被訪問過的對象(即沒有被調用的方法)。跟蹤上一次訪問python對象的最優雅方式是什麼?

我可以保持最後一次訪問並在每種方法中更新它,但有沒有更好的方法來實現這一點?

+0

你爲什麼要這樣做? – Xolve 2011-06-05 07:16:31

+0

我爲每個用戶保留了大量的IMAP連接,所以我只想讓它們保持活動狀態,以避免一次又一次登錄,並且還會在連接對象中緩存一些信息。但我將不得不定期檢查連接是否處於活動狀態等等。 – 2011-06-05 08:45:04

+0

我想你寧可想要一個緩存連接工廠,而不是將時間戳放在imap連接對象上。即'connectionfactory.get_connection(some_host)'會返回一個打開的連接(或者甚至只是一個代理對象),如果它存在或創建一個新的並緩存它。 – 2011-06-05 16:01:50

回答

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 

編輯:添加functools.wraps由@Peter Milley指出。

+1

不要忘記在'def wrap(self):'行之前加入'@ functools.wraps(method)'裝飾器。 – 2011-06-05 12:57:00

+1

@Peter Milley - 好點!我會更新我的例子。乾杯! – mhyfritz 2011-06-05 19:03:24

1

Python的高度動態性使您可以編寫代碼,以有趣的方式包裝對象。在這種情況下,您可以編寫一個代理來替換對象(或整個類)的方法,並使用包裝方法更新時間戳,然後將調用委託給原始方法。

這有點牽扯。一個更簡單的機制是使用Python裝飾器來擴充特定的方法。這也可以讓你豁免一些函數,當它們被調用時(如果你需要的話)不構成「訪問」。

0

你的對象的範圍是什麼?你可以鎖定他們存儲和訪問的地方嗎?如果是這樣,你應該考慮創建一種特殊的容器,它會在上次使用或訪問對象時添加時間戳。訪問這些對象將被一個函數嚴格控制,該函數可以爲上次訪問時間添加時間戳。

2

如果您使用的是python 3.2,那麼看看functions.lru_cache(),看看它是否符合您的要求。它不會給你最後一次修改時間,但它會清理未使用的對象。

對於舊版本,它可能會提供您想要使用的模式,但您必須提供代碼。

+0

謝謝,這對我來說是新的,它非常有幫助 – 2011-06-05 08:46:57

+0

嗯我需要給Python3更好看。 – Xolve 2011-06-05 10:08:47

0

保留IMAP連接的字典,由用戶標識鍵入。編寫一個給定用戶ID的函數,返回一個IMAP連接。該函數將在字典中查找用戶標識,如果用戶標識存在,請獲取相應的IMAP連接,並檢查它是否仍然存在。如果存在,該函數將返回該連接。如果不存在,或者用戶標識不在字典中,它會創建一個新連接,將其添加到字典中,並返回新連接。沒有時間戳需要。

+0

但我不需要「垃圾收集」那些連接一段時間還沒有被訪問的連接? – 2011-06-06 08:18:14

+0

當用戶ID的字典值是一個'死'的IMAP連接,並且您創建一個新的IMAP連接,並用活動的替換死的那個時,您可以在那個時候關閉已死的IMAP連接並執行無論你需要摧毀它。 – 2011-06-08 01:08:54

相關問題