Loading django/utils/functional.py +3 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,9 @@ class cached_property(object): def __init__(self, func): self.func = func def __get__(self, instance, type): def __get__(self, instance, type=None): if instance is None: return self res = instance.__dict__[self.func.__name__] = self.func(instance) return res Loading tests/regressiontests/utils/functional.py +28 −1 Original line number Diff line number Diff line from django.utils import unittest from django.utils.functional import lazy, lazy_property from django.utils.functional import lazy, lazy_property, cached_property class FunctionalTestCase(unittest.TestCase): Loading Loading @@ -37,3 +37,30 @@ class FunctionalTestCase(unittest.TestCase): self.assertRaises(NotImplementedError, lambda: A().do) self.assertEqual(B().do, 'DO IT') def test_cached_property(self): """ Test that cached_property caches its value, and that it behaves like a property """ class A(object): @cached_property def value(self): return 1, object() a = A() # check that it is cached self.assertEqual(a.value, a.value) # check that it returns the right thing self.assertEqual(a.value[0], 1) # check that state isn't shared between instances a2 = A() self.assertNotEqual(a.value, a2.value) # check that it behaves like a property when there's no instance self.assertIsInstance(A.value, cached_property) Loading
django/utils/functional.py +3 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,9 @@ class cached_property(object): def __init__(self, func): self.func = func def __get__(self, instance, type): def __get__(self, instance, type=None): if instance is None: return self res = instance.__dict__[self.func.__name__] = self.func(instance) return res Loading
tests/regressiontests/utils/functional.py +28 −1 Original line number Diff line number Diff line from django.utils import unittest from django.utils.functional import lazy, lazy_property from django.utils.functional import lazy, lazy_property, cached_property class FunctionalTestCase(unittest.TestCase): Loading Loading @@ -37,3 +37,30 @@ class FunctionalTestCase(unittest.TestCase): self.assertRaises(NotImplementedError, lambda: A().do) self.assertEqual(B().do, 'DO IT') def test_cached_property(self): """ Test that cached_property caches its value, and that it behaves like a property """ class A(object): @cached_property def value(self): return 1, object() a = A() # check that it is cached self.assertEqual(a.value, a.value) # check that it returns the right thing self.assertEqual(a.value[0], 1) # check that state isn't shared between instances a2 = A() self.assertNotEqual(a.value, a2.value) # check that it behaves like a property when there's no instance self.assertIsInstance(A.value, cached_property)