Класс cached_property
Класс cached_property из модуля bottle
представляет собой декоратор для создания
вычисляемых свойств класса. В отличие от
обычного property, значение вычисляется
только при первом обращении, а затем сохраняется
во внутреннем словаре экземпляра. При повторных
обращениях возвращается уже готовое значение,
что позволяет избежать повторных затратных
вычислений.
Декоратор применяется к методу класса, первым
параметром которого передаётся экземпляр
self. Метод должен возвращать значение,
которое будет закэшировано. После первого
вызова метод больше не вызывается.
Синтаксис
from bottle import cached_property
class MyClass:
@cached_property
def prop(self):
return value
Пример
Давайте создадим класс с кэшируемым свойством, которое вычисляется один раз:
from bottle import cached_property
class Data:
def __init__(self):
self._count = 0
@cached_property
def value(self):
self._count += 1
return 'hello'
d = Data()
res1 = d.value
res2 = d.value
print(res1)
print(res2)
print(d._count)
Результат выполнения кода:
"hello"
"hello"
1
Как видно из примера, метод value был
вызван только один раз, несмотря на два
обращения к свойству.
Пример
Давайте используем cached_property
в приложении Bottle для кэширования
результата дорогостоящей операции:
from bottle import Bottle, cached_property
app = Bottle()
class Config:
@cached_property
def data(self):
return ['a', 'b', 'c', 'd', 'e']
config = Config()
@app.route('/')
def index():
return str(config.data)
app.run(host='localhost', port=8080)
Результат выполнения кода для адреса
/:
При каждом запросе к серверу список
data не создаётся заново, а берётся
из кэша экземпляра config.
Смотрите также
-
класс
DictProperty,
который предоставляет доступ к словарю через атрибуты -
класс
lazy_attribute,
который вычисляет атрибут при первом обращении -
функцию
load,
которая загружает модуль или объект по имени -
функцию
yieldroutes,
которая превращает генератор в набор маршрутов