Implementing the Null Object Design Pattern
Credit: Dinu C. Gherman
Problem
You want to reduce the need for conditional statements in your code, particularly the need to keep checking for special cases.
Solution
The usual marker for “there’s
nothing here” is None, but we may
be able to do better than that:
class Null:
""" Null objects always and reliably "do nothing." """
def _ _init_ _(self, *args, **kwargs): pass
def _ _call_ _(self, *args, **kwargs): return self
def _ _repr_ _(self): return "Null( )"
def _ _nonzero_ _(self): return 0
def _ _getattr_ _(self, name): return self
def _ _setattr_ _(self, name, value): return self
def _ _delattr_ _(self, name): return selfDiscussion
An instance of the Null class can replace the
primitive value None. Using this class, you can
avoid many conditional statements in your code and can often express
algorithms with little or no checking for special values. This recipe
is a sample implementation of the Null Object design pattern (see
“The Null Object Pattern”, B.
Woolf, Pattern Languages of Programming, PLoP
96, September 1996).
This recipe’s Null class ignores
all parameters passed when constructing or calling instances and any
attempt to set or delete attributes. Any call or attempt to access an
attribute (or a method, since Python does not distinguish between the
two and calls _ _getattr_ _ either way) returns
the same Null instance (i.e.,
self, since there’s no reason to
create a new one). For example, if you have a computation such as: