Я создаю класс, объекты которого инициализируются кучей XML-кода. Класс имеет возможность извлекать различные параметры из этого XML и кэшировать их внутри переменных состояния объекта. Потенциальное количество этих параметров велико и, скорее всего, большинство из них пользователю не понадобятся. Вот почему я решил выполнить "ленивую" инициализацию.
В следующем тестовом примере таким параметром является title
. Когда пользователь пытается получить к нему доступ в первый раз, функция получения анализирует 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
Это выглядит красиво и отлично работает для меня. Однако меня немного беспокоит тот факт, что функция-получатель на самом деле является "сеттером" в том смысле, что она имеет очень значительный побочный эффект на объект. Это законное беспокойство? Если да, то как я должен решить эту проблему?
self._title
в конструкторе и заменить условие в геттере наnot hasattr(self, "_title")
. - person Sven Marnach   schedule 19.01.2011not hasattr(self, '_title')
имхо довольно необычно для ленивой инициализации, а также будет медленнее, чем обычный поиск атрибутов и проверка наNone
. - person lunaryorn   schedule 19.01.2011