Я создаю класс, объекты которого инициализируются куча XML-кода. Класс имеет возможность извлекать различные параметры из этого XML и кэшировать их внутри переменных состояния объекта. Потенциальная величина этих параметров велика и, скорее всего, пользователю не понадобится большинство из них. Вот почему я решил выполнить "ленивую" инициализацию.
В следующем тестовом примере такой параметр title
. Когда пользователь пытается получить доступ к нему в первый раз, функция getter анализирует XML, правильно инициализирует переменную состояния и возвращает ее значение:
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
Это выглядит хорошо и отлично работает для меня. Однако меня немного беспокоит тот факт, что функция геттера фактически является "сеттерной" в том смысле, что она оказывает очень существенное побочное воздействие на объект. Является ли это законной проблемой? Если да, то как мне его адресовать?