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