Ленивая инициализация - это паттерн, который откладывает создание объекта, вычисление значения или выполнение "дорогой" операции, до того пока это действительно не понадобится.
Стоит использовать когда объект используется не всегда, для оптимизации работы с "тяжелыми" ресурсами или когда нужно отложить инициализацию до первого реального использования.
Используется в Django, SQLAlchemy, logging, Django ORM и в funcrools.cached_property или importlib
К плюсам можно занести то, что уменьшается время старта приложения, экономит ресурсы, позволяет избегать ненужных вычислений и упрощает сложные инициализации. Но может маскировать ошибки, усложняет отладку и может привести к неожиданным задержкам при первом обращении.
В отличие от Фабричного метода, Одиночки и Прототипа, Ленивая инициализация откладывает создание, клонирование и инкапсулирование объекта.
`import threading
class ThreadSafeLazyInit: def init(self): self.lock = threading.Lock() self.resource = None
def get_resource(self): if self.resource is None: with self.lock: if self.resource is None: # Double-checked locking print("Инициализируем ресурс...") self.resource = self.init_resource() return self.resource
def _init_resource(self):
#Имитация долгой инициализацииreturn {"id": id(self), "data": "Важные данные"}
#Использованиеdef worker(lazy_init): print(lazy_init.get_resource()["id"])
if name == "main": lazy_init = ThreadSafeLazyInit() threads = []
for _ in range(5): t = threading.Thread(target=worker, args=(lazy_init,)) threads.append(t) t.start()
for t in threads: t.join() #weekofpatterns`