@property
def _lazyprop(self):
    if not hasattr(self, attr_name):
        setattr(self, attr_name, fn(self))
return getattr(self, attr_name)

@_lazyprop.setter
def _lazyprop(self, value):
    raise AttributeError('This property is read-only')
return _lazyprop
Как создать декоратор для ленивой инициализации свойства