Creo una clase cuyos objetos se inicializan con un montón de código XML. La clase tiene la capacidad de extraer varios parámetros de ese XML y almacenarlos en caché dentro de las variables de estado del objeto. La cantidad potencial de estos parámetros es grande y, probablemente, el usuario no necesitará la mayoría de ellos. Es por eso que he decidido realizar una inicialización "floja".Getter con efecto secundario
En el siguiente caso de prueba, tal parámetro es title
. Cuando el usuario intenta acceder a él por primera vez, la función getter analiza el XML, adecuadamente inicializa la variable de estado y devolver su valor:
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
Esto se ve bien y funciona bien para mí. Sin embargo, me molesta un poco el hecho de que la función getter es en realidad una "setter" en el sentido de que tiene un efecto secundario muy significativo en el objeto. ¿Es esto una preocupación legítima? Si es así, ¿cómo debería abordarlo?
Independientemente de cuál sea la respuesta real a la pregunta, no debe usar guiones bajos iniciales principales. Empiezan a crear nombres, es decir, muchos dolores potenciales y ganancia cero. Solo usa un solo guion bajo. – delnan
No veo por qué es un problema. –
Propuesta de refactorización secundaria: no inicialice 'self._title' en el constructor, y reemplace la condición en el getter por' not hasattr (self, "_title") '. –