inherit without calling parent class constructor?
Steven Bethard
steven.bethard at gmail.com
Wed Jan 26 14:45:42 EST 2005
Christian Dieterich wrote:
> The size attribute only needs to be computed once and stays constant
> after that. The lazy property recipe of Scott David Daniels looks
> promising. I'll try that, when I've installed Python 2.4. However, I
> need my package to work on machines where there is Python 2.2 and 2.3 only.
Note that:
@deco
def func(...):
...
is basically just syntactic sugar for:
def func(...):
...
func = deco(func)
So you don't need 2.4 to use the recipe; you just need a version of
Python that supports descriptors (2.2 or later) since the recipe uses a
class with __get__. I believe the following code should work for Python
2.2 and later, though I only have 2.4 to test it on at home.
py> class LazyAttribute(object):
... def __init__(self, calculate_function):
... self._calculate = calculate_function
... def __get__(self, obj, _=None):
... if obj is None:
... return self
... value = self._calculate(obj)
... setattr(obj, self._calculate.func_name, value)
... return value
...
py> class B(object):
... def __init__(self, length):
... self._length = length
... def size(self):
... print 'some expensive calculation'
... return self._length
... size = LazyAttribute(size)
...
py> class D(B):
... def __init__(self, length):
... super(D, self).__init__(length)
... self.value = 1
...
py> b = B(5)
py> b.size
some expensive calculation
5
py> b.size
5
py> d = D(6)
py> d.size
some expensive calculation
6
py> d.size
6
Note that b.size and d.size are only calculated once each, and if d.size
is never accessed, you'll never incur the costs of calculating it.
Steve
More information about the Python-list
mailing list