Creo una classe i cui oggetti sono inizializzati con un gruppo di codice XML. La classe ha la capacità di estrarre vari parametri da quell'XML e di memorizzarli nella cache all'interno delle variabili di stato dell'oggetto. La quantità potenziale di questi parametri è ampia e molto probabilmente, l'utente non ne avrà più bisogno. Questo è il motivo per cui ho deciso di eseguire un'inizializzazione "pigra".Getter con effetto collaterale
Nel seguente caso di test un tale parametro è title
. Quando l'utente tenta di accedere per la prima volta, la funzione getter analizza il XML, correttamente inizializza la variabile di stato e tornare il suo valore:
class MyClass(object):
def __init__(self, xml=None):
self.xml = xml
self.title = None
def get_title(self):
if self.__title is None:
self.__title = self.__title_from_xml()
return self.__title
def set_title(self, value):
self.__title = value
title = property(get_title, set_title, None, "Citation title")
def __title_from_xml(self):
#parse the XML and return the title
return title
Questo sembra bello e funziona bene per me. Tuttavia, sono disturbato un po 'dal fatto che la funzione getter è in realtà una "setter", nel senso che ha un effetto collaterale molto significativo sull'oggetto. È una preoccupazione legittima? Se sì, come dovrei affrontarlo?
Indipendentemente da quale sia la risposta effettiva alla domanda, non utilizzare i doppi underscore principali. Iniziano il nome di maciullamento, cioè un sacco di dolore potenziale e guadagno zero. Basta usare un singolo trattino basso. – delnan
Non vedo perché è un problema. –
Proposta di refactoring minore: non inizializzare 'self._title' nel costruttore e sostituire la condizione nel getter con' not hasattr (self, "_title") '. –