РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
233 of 252 menu

Класс lazy_attribute

Класс lazy_attribute применяется как декоратор к методу класса. Метод должен принимать только self и возвращать значение атрибута. При первом обращении к атрибуту метод вызывается, а его результат сохраняется в экземпляре. Все последующие обращения возвращают уже вычисленное значение без повторного вызова метода.

Синтаксис

from bottle import lazy_attribute class MyClass: @lazy_attribute def attr(self): return value

Пример

Давайте создадим класс с ленивым атрибутом и посмотрим, сколько раз вызовется метод:

from bottle import lazy_attribute class User: def __init__(self, name): self.name = name self.calls = 0 @lazy_attribute def greeting(self): self.calls += 1 return 'hello, ' + self.name user = User('abcde') res = user.greeting print(res) print(user.calls) res = user.greeting print(res) print(user.calls)

Результат выполнения кода:

"hello, abcde" 1 "hello, abcde" 1

Как видно из результата, метод greeting был вызван только один раз, хотя к атрибуту мы обратились дважды.

Пример

Давайте применим lazy_attribute в приложении Bottle для кэширования тяжёлых вычислений:

from bottle import Bottle, lazy_attribute class Data: def __init__(self): self.calls = 0 @lazy_attribute def items(self): self.calls += 1 return ['a', 'b', 'c', 'd', 'e'] app = Bottle() data = Data() @app.route('/') def index(): res = data.items res = data.items return str(data.calls)

Результат выполнения кода для адреса /:

<+html+> 1 <-html+>

Несмотря на два обращения к атрибуту items внутри обработчика, метод выполнился лишь один раз.

Смотрите также

  • класс cached_property,
    который кэширует значение свойства
  • класс DictProperty,
    который даёт доступ к словарю как к атрибутам
  • функцию load,
    которая загружает объект по строковому имени
  • функцию yieldroutes,
    которая превращает генератор в набор маршрутов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить