From 06c2fc97ad7cc6a59168e5995894167100a4cf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Fri, 1 Jun 2018 13:58:50 +0200 Subject: [PATCH] Implement decorator to lazy initialise a property --- lib/tfw/decorators/__init__.py | 1 + lib/tfw/decorators/lazy_initialise.py | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 lib/tfw/decorators/lazy_initialise.py diff --git a/lib/tfw/decorators/__init__.py b/lib/tfw/decorators/__init__.py index 80c5788..cd61318 100644 --- a/lib/tfw/decorators/__init__.py +++ b/lib/tfw/decorators/__init__.py @@ -2,3 +2,4 @@ # All Rights Reserved. See LICENSE file for details. from .rate_limiter import RateLimiter +from .lazy_initialise import LazyInitialise diff --git a/lib/tfw/decorators/lazy_initialise.py b/lib/tfw/decorators/lazy_initialise.py new file mode 100644 index 0000000..615721b --- /dev/null +++ b/lib/tfw/decorators/lazy_initialise.py @@ -0,0 +1,19 @@ +# Copyright (C) 2018 Avatao.com Innovative Learning Kft. +# All Rights Reserved. See LICENSE file for details. + + +class LazyInitialise: + """ + Decorator that replaces a function with the value + it calculates on the first call. + """ + def __init__(self, func): + self.func = func + self.__doc__ = func.__doc__ + + def __get__(self, instance, owner): + if instance is None: + raise TypeError('Cannot get object property from class!') + value = self.func(instance) + setattr(instance, self.func.__name__, value) + return value