Baru-baru ini saya telah melalui basis kode yang ada yang berisi banyak kelas di mana atribut contoh mencerminkan nilai yang disimpan dalam database. Saya telah merefaktor banyak atribut ini agar pencarian database mereka ditangguhkan, yaitu. tidak akan dijalankan di konstruktor tetapi hanya setelah dibaca pertama kali. Atribut ini tidak berubah selama masa pakai instance, tetapi merupakan hambatan nyata untuk menghitungnya pertama kali dan hanya benar-benar diakses untuk kasus khusus. Oleh karena itu, mereka juga dapat di-cache setelah diambil dari database (oleh karena itu hal ini sesuai dengan definisi memoisation di mana input hanyalah "tanpa input").
Saya mendapati diri saya mengetik cuplikan kode berikut berulang kali untuk berbagai atribut di berbagai kelas:
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
Apakah sudah ada dekorator untuk melakukan ini dengan Python yang tidak saya sadari? Atau, adakah cara yang cukup sederhana untuk mendefinisikan dekorator yang melakukan ini?
Saya bekerja dengan Python 2.5, tetapi jawaban 2.6 mungkin masih menarik jika berbeda secara signifikan.
Catatan
Pertanyaan ini ditanyakan sebelum Python memasukkan banyak dekorator siap pakai untuk ini. Saya telah memperbaruinya hanya untuk memperbaiki terminologi.
functools.lru_cache()
.