To be clear, my original post had a goof. So my original, de-goofed, idiom was
class Foo (object) : _lazy = None def foo(self, x) : self._lazy = self._lazy or self.get_something(x) def get_something(self, x) : # doesn't really matter, so long as it returns truthy result and the new, improved idiom is class Foo (object) : def foo(self, x) : self._lazy = getattr(self, "_lazy", None) or self._get_something(x) def _get_something(self, x) : # doesn't really matter, so long as it returns truthy result I was laboring under some misconception that there was Python magic that allowed __init__ and only __init__ to add class attributes by setting their values. Good to know this piece of magic isn't part of Python, and thus lazy eval can be handled more cleanly than I originally thought. In other words, "Guido was here". Thanks again -- https://mail.python.org/mailman/listinfo/python-list