class LazyProperty: def __init__(self, func): self.func = func def __get__(self, instance, owner): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return value class MyClass: def __init__(self): pass @LazyProperty def demo(self): return 'demo' @LazyProperty def demo2(self): return 'demo2' def test_demo(): d = MyClass() print(d.demo) print(d.demo2)