Класс 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)
Результат выполнения кода для адреса /:
Несмотря на два обращения к атрибуту items внутри обработчика,
метод выполнился лишь один раз.
Смотрите также
-
класс
cached_property,
который кэширует значение свойства -
класс
DictProperty,
который даёт доступ к словарю как к атрибутам -
функцию
load,
которая загружает объект по строковому имени -
функцию
yieldroutes,
которая превращает генератор в набор маршрутов