Son zamanlarda, örnek niteliklerinin bir veritabanında depolanan değerleri yansıttığı birçok sınıf içeren mevcut bir kod tabanından geçtim. Veritabanı aramalarının ertelenmesi için bu özniteliklerin çoğunu yeniden düzenledim. yapıcıda başlatılmamalıdır, ancak yalnızca ilk okunduğunda. Bu öznitelikler, örneğin kullanım ömrü boyunca değişmez, ancak ilk kez hesaplamak için gerçek bir darboğazdır ve yalnızca özel durumlar için gerçekten erişilir. Bu nedenle, veritabanından alındıktan sonra da önbelleğe alınabilir (bu nedenle bu , girdinin basitçe "giriş yok" olduğu hafızaya alma tanımına uyar ).
Kendimi, çeşitli sınıflarda çeşitli öznitelikler için aşağıdaki kod parçacığını tekrar tekrar yazarken buluyorum:
class testA(object):
def __init__(self):
self._a = None
self._b = None
@property
def a(self):
if self._a is None:
# Calculate the attribute now
self._a = 7
return self._a
@property
def b(self):
#etc
Bunu zaten Python'da yapacak, farkında olmadığım bir dekoratör var mı? Ya da, bunu yapan bir dekoratörü tanımlamanın oldukça basit bir yolu var mı?
Python 2.5 altında çalışıyorum, ancak 2.6 cevapları önemli ölçüde farklıysa yine de ilginç olabilir.
Not
Bu soru, Python bunun için birçok hazır dekoratör eklemeden önce sorulmuştu. Sadece terminolojiyi düzeltmek için güncelledim.
functools.lru_cache().