Ленивая инициализация - это паттерн, который откладывает создание объекта, вычисление значения или выполнение "дорогой" операции, до того пока это действительно не понадобится.

Стоит использовать когда объект используется не всегда, для оптимизации работы с "тяжелыми" ресурсами или когда нужно отложить инициализацию до первого реального использования.

Используется в 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`