On Wed, 23 Nov 2016 08:10 pm, Frank Millman wrote: [...] > The class has a getval() method to return the current value. > > Usually the value is stored in the instance, and can be returned > immediately, but sometimes it has to be computed, incurring further > database lookups.
This is called memoisation, or caching, and is a perfectly standard programming technique. It's not without its traps though: there's a famous quote that says there are only two hard problems in computing, naming things and cache invalidation. But putting that aside: def getval(self): sentinel = object() value = getattr(self, '_cached_value', sentinel) if value is sentinel: # compute the value and store it value = ... self._cached_value = value return value To invalidate the cache and force a recalculation: del self._cached_value Now it's easy to override: class Subclass(ParentClass): def getval(self): value = super(Subclass, self).getval() return value + 1 > This is what I have come up with. > > 1. Rename all instances of 'getval()' to '_getval()'. > > 2. Add a new method '_getval_with_comp()'. > > 3. When instantiating an object, check if it would need computation - > if computation_required: > self.getval = self._getval_with_comp > else: > self.getval = self._getval So this check only happens once, on instantiation? And you're sure that once the instance is created, there will never be any circumstances where you want to re-calculate the value? > 4. In _getval_with_comp, perform the computation, then add the following - > self.getval = self._getval > return self._getval() So you have something like this? def _getval(self): return self._cached_value def __getval_with_comp(self): value = ... # long computation self._cached_value = value self.getval = self._getval # return value return self._getval() # why call the method when you already know the answer? How are subclasses supposed to override getval? -- Steve “Cheer up,” they said, “things could be worse.” So I cheered up, and sure enough, things got worse. -- https://mail.python.org/mailman/listinfo/python-list