2011-06-05 23 views
5

Python'da bazı nesnelerin düzenli olarak kontrol edip yok edeceğine dair bir liste var - son zamanlarda erişilemeyenler (yani hiçbir yöntem çağrılmadı).Son kez bir python nesnesine erişmenin en zarif yolu nedir?

En son erişilen süreyi koruyabilir ve her yöntemde güncelleyebilirim, ancak bunu başarmanın daha zarif bir yolu var mı?

+0

Bunu neden yapmak istersiniz? – Xolve

+0

Her kullanıcı için birkaç IMAP bağlantısı yapıyorum, bu yüzden tekrar giriş yapmaktan kaçınmak ve bağlantı nesnesinde bazı bilgileri önbelleğe almak için yalnızca onları canlı tutmak istiyorum. Ancak bağlantıların etkin olup olmadığını düzenli olarak kontrol etmem gerekecek ... –

+0

Sanırım imap bağlantı nesnelerine zaman damgaları koymak yerine bir önbellekleme bağlantı fabrikası almak istersiniz. yani “connectionfactory.get_connection (some_host)” açık bir bağlantıyı (hatta bir proxy nesnesini) varsa, varsa veya yeni bir tane oluşturup önbelleğe döndürür. –

cevap

6

@Marcelo Cantos'un belirttiği gibi zaman damgası işlevselliği ile sarılmasını istediğiniz yöntemlerle ilgili bir dekoratör kullanın.

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 

Düzenleme::

bu örneği düşünün @Peter Milley tarafından işaret functools.wraps olarak eklenmiştir.

+1

'wrap (self):' satırından önce '@ functools.wraps (method)' dekoratörünü eklemeyi unutmayın. –

+1

@Peter Milley - İyi nokta! Örneğimi güncelleyeceğim. Şerefe! – mhyfritz

1

Python'un son derece dinamik doğası, nesneleri çeşitli şekillerde sarmalayan proxy'ler yazmanızı sağlar. Bu durumda, bir zaman damgasını güncelleyen sarmalayıcı yöntemlerle bir nesnenin (veya tüm bir sınıfın) yöntemlerini değiştiren ve daha sonra çağrıyı özgün yönteme delege eden bir proxy yazabilirsiniz.

Bu biraz ilgili. Daha basit bir mekanizma, Python dekoratörlerini belirli yöntemleri güçlendirmek için kullanmaktır. Bu, ayrıca çağrılırken "erişim" oluşturmayan bazı işlevleri de muaf tutmanızı sağlar (buna ihtiyacınız varsa).

0

Nesnelerinizin kapsamı nedir? Saklandıkları ve erişildikleri yerleri kilitleyebilir misiniz? Eğer öyleyse, nesnenin en son ne zaman kullanıldığı veya erişildiği zaman damgası olacak bir tür özel kapsayıcı oluşturmayı düşünmelisiniz. Nesneye erişim, son erişim zamanını zaman damgası haline getirebilecek bir işlev tarafından sıkı bir şekilde kontrol edilecektir.

2

Eğer python 3.2 kullanıyorsanız, functions.lru_cache()'a bir göz atın ve ne yapmak istediğinizi görün. Size son değiştirilmiş bir zaman vermeyecek, ancak kullanılmayan nesnenin temizlenmesini sağlayacak.

Eski sürümlerde kullanmak istediğiniz kalıbı sağlayabilir, ancak kodu sağlamanız gerekir.

+0

teşekkürler, bu benim için yeni ve çok yararlı –

+0

hmm Python3'e daha iyi bir görünüm vermem gerekiyor. – Xolve

0

Kullanıcı kimliği ile girilen IMAP bağlantılarının bir dict dosyasını saklayın. Bir kullanıcı kimliği verilen bir işlev, bir IMAP bağlantısı döndürür. İşlev, kullanıcı kimliğini dict içinde arar ve kullanıcı kimliği varsa, ilgili IMAP bağlantısını edinin ve hala canlı olduğunu kontrol edin. Canlıysa, işlev bu bağlantıyı döndürür. Canlı değilse veya kullanıcı kimliği dict'ta değilse, yeni bir bağlantı oluşturur, bunu dict'e ekler ve yeni bağlantıyı döndürür. Zaman damgası gerekmez.

+0

fakat bir süredir erişilemeyen bu bağlantıdaki bağlantıları "çöpe atmak" zorunda değil miyim? –

+0

Bir kullanıcı kimliğinin dikte değeri 'ölü' bir IMAP bağlantısı olduğunda ve yeni bir IMAP bağlantısı oluşturduğunuzda ve ölü olanı canlı olanla değiştirdiğinizde, ölü IMAP bağlantısını kapatabilirsiniz. Onu yok etmek için ne gerekiyorsa. –

İlgili konular