class lazy(object):
def __init__(self, function):
self._function = function
def __get__(self, instance, owner = None):
if instance == None:
return self
val = self._function(instance)
setattr(instance, self._function.func_name, val)
return val
class line(object):
def __init__(self, line = None):
self._line = line
@lazy
def items(self):
return self._line.split()
Объяснение: items, коль скоро он декорируется, становится объектом класса lazy, и начинает восприниматься как дескриптор(descriptor). Поэтому __get__, __set__ и __delete__ могут быть определены у класса lazy. Конкретная реализация __get__ вычисляет значение функции и привязывает объект с результатом в качестве атрибута вместо себя на свое имя. Значит, последующие обращения к items — уже не вызов функции, а просто операции со списком, что вернулся при первом вызове.
Комментариев нет:
Отправить комментарий