Andriy Kornatskyy avatar Andriy Kornatskyy committed 903e0af

``attribute`` decorator is intended to promote a function call to object attribute.

Comments (0)

Files changed (1)

src/wheezy/core/descriptors.py

+
+""" ``descriptors`` module.
+"""
+
+class attribute(object):
+    """ ``attribute`` decorator is intended to promote a
+        function call to object attribute. This means the
+        function is called once and replaced with
+        returned value.
+
+        >>> class A:
+        ...     def __init__(self):
+        ...         self.counter = 0
+        ...     @attribute
+        ...     def count(self):
+        ...         self.counter += 1
+        ...         return self.counter
+        >>> a = A()
+        >>> a.count
+        1
+        >>> a.count
+        1
+    """
+    def __init__(self, f):
+        self.f = f
+        self.__module__ = f.__module__
+        self.__name__ = f.__name__
+        self.__doc__ = f.__doc__
+
+    def __get__(self, obj, t=None):
+        val = self.f(obj)
+        setattr(obj, self.f.__name__, val)
+        return val
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.