Създавам клас, чиито обекти се инициализират с куп 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
Това изглежда добре и работи добре за мен. Въпреки това съм обезпокоен малко от факта, че getter функцията всъщност е "setter" в смисъл, че има много значителен страничен ефект върху обекта. Това основателна загриженост ли е? Ако е така, как трябва да го реша?
self._title
в конструктора и заменете условието в гетъра сnot hasattr(self, "_title")
. - person Sven Marnach   schedule 19.01.2011not hasattr(self, '_title')
е доста необичайно за мързелива инициализация и също така ще бъде по-бавно от нормално търсене на атрибут и тест срещуNone
. - person lunaryorn   schedule 19.01.2011