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 — уже не вызов функции, а просто операции со списком, что вернулся при первом вызове.
Комментариев нет:
Отправить комментарий