Ho un oggetto stato che rappresenta un sistema. Le proprietà all'interno dell'oggetto stato sono popolate da [enormi] file di testo. Poiché non tutti i proprietà si accede ogni volta che un'istanza di stato, è stato creato, ha senso per loro caricare pigramente .:Variabili di caricamento lento utilizzando decoratori sovraccaricati
class State:
def import_positions(self):
self._positions = {}
# Code which populates self._positions
@property
def positions(self):
try:
return self._positions
except AttributeError:
self.import_positions()
return self._positions
def import_forces(self):
self._forces = {}
# Code which populates self._forces
@property
def forces(self):
try:
return self._forces
except AttributeError:
self.import_forces()
return self._forces
C'è un sacco di codice standard ripetitivo qui. Inoltre, a volte un import_abc può popolare alcune variabili (ad esempio, importa alcune variabili da un piccolo file di dati se è già aperto).
Ha senso sovraccaricare @property tale che accetta una funzione di "fornire" quella variabile, vale a dire:
class State:
def import_positions(self):
self._positions = {}
# Code which populates self._positions
@lazyproperty(import_positions)
def positions(self):
pass
def import_forces(self):
self._forces = {}
# Code which populates self._forces and self._strain
@lazyproperty(import_forces)
def forces(self):
pass
@lazyproperty(import_forces)
def strain(self):
pass
Tuttavia, non riesco a trovare un modo per tracciare esattamente quello metodo sono essere chiamato nel decoratore @property. In quanto tale, non so come affrontare l'overloading di @property nella mia @lazyproperty.
Qualche idea?
Questo non funzionerà se crei più di una istanza di 'Stato'. Stai memorizzando i dati sul funzione oggetto del metodo, ma il metodo esiste solo una volta a livello di classe, quindi qualunque cosa tu faccia ad esso interesserà tutte le istanze. Se fai un secondo 'State' e ne muti le posizioni, vedrai le modifiche mostrarsi in entrambe le istanze. – BrenBarn
Hai ragione, risolto. – lunixbochs